變量類型:
@@為全局變量,數據庫提供的
@局部變量,用戶自定義
QL中的 @、@@、#、## 、N 代表什么
@ 表示局部變量
@@ 表示全局變量
'#' 表示本地臨時表的名稱,以單個數字符號打頭;它們僅對當前的用戶連接是可見的
'##' 表示全局臨時表
N 代表存入數據庫時以 Unicode 格式存儲(雙字節),不帶N是以普通字符常量存儲(單字節)。例如:N'你好' ---2020.03.17
'#'本地臨時表,以一個井號 (#) 開頭的表名。
只有在創建本地臨時表連接是才能看得到,連接斷開時臨時表立馬被刪除,也就是到貨本地臨時表為創建它的該鏈接的會話所獨有,或者說局部臨時表是有當前用戶創建的,並且只有當前用戶的會話才可以訪問。
'##'全局臨時表,以兩個井號 (##) 開頭的表名。
在所有連接上都能看到全局臨時表,也就是說只要全局臨時表存在,那么對所有創建用戶的會話后都是可見的。如果在創建全局臨時表的連接斷開前沒有顯式地除去全局臨時表,那么只能等到其它所有任務都停止引用,這些表才會被刪除。
當創建全局臨時表的連接斷開后,新的任務不能再引用它們,也就是說舊的任務才可以引用。當前的語句一執行完,任務與表之間的關聯即被除去;因此通常情況下,只要創建全局臨時表的連接斷開,全局臨時表也會同時被刪除。
常用系統全局變量:
@@CONNECTIONS 返回自上次啟動以來連接或試圖連接的次數。
@@CURSOR_ROWS 返回連接上最后打開的游標中當前存在的合格行的數量(返回被打開的游標中還未被讀取的有效數據行的行數)
@@DATEFIRST 返回每周第一天的數字
@@ERROR 返回最后執行的SQL 語句的錯誤代碼。
@@FETCH_STATUS 返回被 FETCH 語句執行的最后游標的狀態,而不是任何當前被連接打開的游標的狀態。
@@IDENTITY 返回最后插入的標識值
@@LANGID 返回當前所使用語言的本地語言標識符(ID)。
@@LANGUAGE 返回當前使用的語言名。
@@LOCK_TIMEOUT 返回當前會話的當前鎖超時設置,單位為毫秒。
@@PROCID 返回當前過程的存儲過程標識符 (ID) 。
@@ROWCOUNT 返回受上一語句影響的行數。
@@SERVERNAME 返回運行 的本地服務器名稱。
@@SPID 返回當前用戶進程的服務器進程標識符 (ID)。
@@TRANCOUNT 返回當前連接的活動事務數。
@@VERSION 返回當前安裝的日期、版本和處理器類型。
@@CPU_BUSY 返回自SQL Server 最近一次啟動以來CPU 的工作時間其單位為毫秒
@@DATEFIRST 返回使用SET DATEFIRST 命令而被賦值的DATAFIRST 參數值SET DATEFIRST,命令用來指定每周的第一天是星期幾
@@DBTS 返回當前數據庫的時間戳值必須保證數據庫中時間戳的值是惟一的
@@ERROR 返回執行Transact-SQL 語句的錯誤代碼
@@FETCH_STATUS 返回上一次FETCH 語句的狀態值
@@IDLE 返回自SQL Server 最近一次啟動以來CPU 處於空閉狀態的時間長短單位為毫秒
@@IO_BUSY 返回自SQL Server 最近一次啟動以來CPU 執行輸入輸出操作所花費的時間其單位為毫秒
@@LANGID 返回當前所使用的語言ID 值
@@LANGUAGE 返回當前使用的語言名稱
@@LOCK_TIMEOUT 返回當前會話等待鎖的時間長短其單位為毫秒
@@MAX_CONNECTIONS 返回允許連接到SQL Server 的最大連接數目
@@MAX_PRECISION 返回decimal 和numeric 數據類型的精確度
@@NESTLEVEL 返回當前執行的存儲過程的嵌套級數初始值為0
@@OPTIONS 返回當前SET 選項的信息
@@PACK_RECEIVED 返回SQL Server 通過網絡讀取的輸入包的數目
@@PACK_SENT 返回SQL Server 寫給網絡的輸出包的數目
@@PACKET_ERRORS 返回網絡包的錯誤數目
@@PROCID 返回當前存儲過程的ID 值
@@REMSERVER 返回遠程SQL Server 數據庫服務器的名稱
@@SERVICENAME 返回SQL Server 正運行於哪種服務狀態之下如MSSQLServer MSDTC SQLServerAgent
@@SPID 返回當前用戶處理的服務器處理ID 值
@@TEXTSIZE 返回SET 語句的TEXTSIZE 選項值SET 語句定義了SELECT 語句中text 或image數據類型的最大長度基本單位為字節
@@TIMETICKS 返回每一時鍾的微秒數
@@TOTAL_ERRORS 返回磁盤讀寫錯誤數目
@@TOTAL_READ 返回磁盤讀操作的數目
@@TOTAL_WRITE 返回磁盤寫操作的數目
@@TRANCOUNT 返回當前連接中處於激活狀態的事務數目
————————————————
123
execute相信大家都用的用熟了,簡寫為exec,除了用來執行存儲過程,一般都用來執行動態Sql
sp_executesql,sql2005中引入的新的系統存儲過程,也是用來處理動態sql的, 如:
exec sp_executesql @sql, N'@count int out,@id varchar(20)', @cou out ,@id
@sql為拼成的動態sql
N'@count int out,@id varchar(20)'為拼成的動態sql內的參數列表
@cou out,@id為為動態sql內參數列表提供值的外部參數列表
那么它們之間有什么區別呢?
1、它們之間最大的區別是嵌入式的參數,如下面一個語句
DECLARE @sql NVARCHAR(2000);
DECLARE @id VARCHAR(20);
SET @id = '1';
SET @sql = 'select count() from emp where id=' + @id;
EXEC @sql;
我想把得到的count()傳出來,用傳統的exec是不好辦到的,但是用sp_executesql則很容易就辦到了:
DECLARE @sql NVARCHAR(2000);
DECLARE @cou INT;
DECLARE @id VARCHAR(20);
SET @id = '1';
SET @sql = 'select @count=count(*) from emp where id=@id';
EXEC sp_executesql @sql, N'@count int out,@id varchar(20)', @cou OUT, @id;
PRINT @cou;
2、性能
可以看到,如果用exec,由於每次傳入的@id不一樣,所以每次生成的@sql就不一樣,這樣每執行一次Sql2005就必須重新將要執行的動態Sql重新編譯一次
但是sp_executesql則不一樣,由於將數值參數化,要執行的動態Sql永遠不會變化,只是傳入的參數的值在變化,那每次執行的時候就秒用重新編譯,速度自然快多了哈!
注意:
1.sp_executesql要求動態Sql和動態Sql參數列表必須是Nvarchar,比如上個例子的@sql,N'@count int out,@id varchar(20)'我記得在sql2005中Varchar也可以的,但是我打了Sp3補丁后就不行了,必須為Nvarchar
2.動態Sql的參數列表與外部提供值的參數列表順序必需一致,如:
N'@count int out,@id varchar(20)', @cou out,@id
@count 對應 @cou,@id對應@id
如果不一致,必須顯式標明,如:
N'@count int out,@id varchar(20)', @id=@id, @count=@cou out
3.動態SQl的參數列表與外部提供參數的參數列表參數名可以同名