資料庫相關之SQL Server(一)
來源:互聯網
上載者:User
server|資料|資料庫 1.1、進階查詢語句
1、 TRUNCATE TABLE [table_name]
刪除表中的所有行,而不記錄單個行刪除操作。
TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和交易記錄資源少。
DELETE 語句每次刪除一行,並在交易記錄中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放儲存表資料所用的資料頁來刪除資料,並且只在交易記錄中記錄頁的釋放。
新行標識所用的計數值重設為該列的種子。如果想保留標識計數值,請改用 DELETE。
對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由於 TRUNCATE TABLE 不記錄在日誌中,所以它不能啟用觸發器。
2、 SP_DATABASES
返回在 sysdatabases 系統資料表中列出的資料庫。
sp_databases 在開放式資料庫連接 (ODBC) 中沒有等價的過程。
3、 SP_DATATYPE_INFO
sp_datatype_info 等價於 ODBC 中的 SQLGetTypeInfo。返回結果按 DATA_TYPE 排序,再按資料類型映射為相應 ODBC SQL 資料類型的緊密程度進行排序。
4、 SP_COLUMNS
返回當前環境中可查詢的指定表或視圖的列資訊。
Sp_columns [table_name]
Or:sp_columns @table_name = '[table_name]', @column_name = '[column_name]'
5、 SP_TABLES
用法同上,不再雷述。
1.2、預存程序
所有設計優良的 Microsoft® SQL Server™ 2000 應用程式都應當使用預存程序。不論是否將應用程式的商務邏輯寫入預存程序都應如此。甚至連沒有商務邏輯組件的標準 Transact-SQL 陳述式,在用參數打包成預存程序後也能獲得效能收益。編譯進預存程序的 Transact-SQL 陳述式在執行時可省去大量的處理。
1.2.1預存程序的設計規則
l CREATE PROCEDURE 定義本身可包括除下列 CREATE 語句以外的任何數量和類型的 SQL 陳述式,預存程序中的任意地方都不能使用下列語句:
CREATE DEFAULT
CREATE TRIGGER
CREATE PROCEDURE
CREATE VIEW
CREATE RULE
l 預存程序中參數的最大數目為 2100。
l 可以在預存程序內引用暫存資料表。
l 如果在預存程序內建立本地暫存資料表,則該暫存資料表僅為該預存程序而存在;退出該預存程序後,暫存資料表即會消失。
1.2.2建立預存程序
樣本:
CREATE PROCEDURE [PR_insert_casebrief_NEW]
@p_Casebrief_code as varchar(50),@p_Object_id as integer,@p_Spy_starttime as datetime,
@p_Spy_endtime as datetime,@p_Casebrief_id as integer out
as
insert into Case_brief_telecom(Casebrief_code,object_id,Spy_starttime,Spy_endtime,)
values(@p_Casebrief_code,@p_Object_id,@p_Spy_starttime,@p_Spy_endtime)
select @p_Casebrief_id = @@identity
GO
**** p_Casebrief_id為該表的主鍵,自動成長。
l Microsoft® SQL Server™ 2000 預存程序以四種方式返回資料:
1、輸出參數,既可以返回資料(整型值或字元值等),也可以返回遊標變數(遊標是可以逐行檢索的結果集)。
2、傳回碼,始終是整型值。
3、SELECT 語句的結果集,這些語句包含在該預存程序內或該預存程序所調用的任何其它預存程序內。
4、可從預存程序外引用的全域遊標。
l 當一個預存程序調用另一個預存程序時,預存程序就會嵌套。預存程序最多可以嵌套 32 級。被調用預存程序開始執行時,嵌套級數增加一級;被調用預存程序完成執行時,嵌套級數減少一級。試圖超出 32 級的最高嵌套級數時,將導致整個預存程序調用鏈的失敗。正在執行的預存程序的當前嵌套級數儲存在 @@NESTLEVEL 函數中。
l 預存程序中使用遊標:
CREATE procedure XG_Insert_XXX
as
declare @object_id as int
declare @CaseBriefID as varchar(4)
declare @number_style as varchar(50)
declare @strNumberType2 as varchar(50)
declare @number_code as varchar(50)
declare @strSQL as varchar(1000)
declare @strSQL1 as varchar(255)
declare @brief_code as varchar(50)
declare @creator as varchar(50)
declare @BH as varchar(50)
DECLARE OBJECT_CURSOR CURSOR
FOR SELECT distinct object_id,CaseBrief_ID,casebrief_code,table_creator from case_XXX
OPEN OBJECT_CURSOR
FETCH NEXT FROM OBJECT_CURSOR INTO @object_id,@CaseBriefID,@brief_code,@creator
while (@@FETCH_STATUS = 0)
BEGIN
SELECT @BH=FullCode from View_user_depID where LoginName=''+@creator+''
print @BH
DECLARE NUMBER_CURSOR CURSOR
FOR SELECT distinct number_style,number_code from case_XXX where object_id=@object_id
OPEN NUMBER_CURSOR
FETCH NEXT FROM NUMBER_CURSOR INTO @number_style,@number_code
while (@@FETCH_STATUS = 0)
BEGIN
set @strSQL='insert into CASE_XXX(CASEBRIEF_ID,NUM_TYPE,NUMBER) values(' + @CaseBriefID + ','''+ @number_style + ''',''' + @number_code + ''')'
exec(@strSQL)
FETCH NEXT FROM NUMBER_CURSOR INTO @number_style,@number_code
END
CLOSE NUMBER_CURSOR
DEALLOCATE NUMBER_CURSOR
FETCH NEXT FROM OBJECT_CURSOR INTO @object_id,@CaseBriefID,@brief_code,@creator
END
CLOSE OBJECT_CURSOR
DEALLOCATE OBJECT_CURSOR
GO