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