SQL Server在T-SQL語句中使用變量
變量的種類
在T-SQL中,變量按生存范圍可以分為全局變量(Global Variable)和局部變量(Local Variable)
- 全局變量是由系統(tǒng)定義的,在整個(gè)SQL Server實(shí)例內(nèi)都能訪問到的變量,全部變量以@@開頭,用戶只能訪問,不能賦值。
- 局部變量由用戶定義,生命周期只在一個(gè)批處理內(nèi)有效。局部變量以@作為第一個(gè)字符,由用戶自己定義和復(fù)制。
示例:
DECLARE @i int --聲明一個(gè)int類型局部變量 SET @i = 10 --通過SET對(duì)局部變量進(jìn)行賦值 DECLARE @Name nvarchar(20) --聲明一個(gè)nvarchar(20)類型變量 SET @Name = '張飛' PRINT @@VERSION --全部變量,只能讀取,不能賦值 SET @@VERSION = '123' --此行代碼報(bào)錯(cuò)
全局變量
全局變量的用途
- 全局變量是SQL Server系統(tǒng)內(nèi)部使用的變量,其作用范圍并不僅僅局限于某一程序,而是任何程序均可以隨時(shí)調(diào)用。
- 全局變量通常存儲(chǔ)一些SQL Server的配置設(shè)定值和統(tǒng)計(jì)數(shù)據(jù)。用戶可以在程序中用全局變量來測試系統(tǒng)的設(shè)定值或者是Transact-SQL命令執(zhí)行后的狀態(tài)值。
全局變量列表
select @@CONNECTIONS; --返回自上次SQL啟動(dòng)以來連接或試圖連接的次數(shù)。 select @@CPU_BUSY / 100; --返回自上次啟動(dòng)SQL 以來 CPU 的工作時(shí)間,單位為毫秒 select @@CURSOR_ROWS as w; --返回被打開的游標(biāo)中還未被讀取的有效數(shù)據(jù)行的行數(shù) select @@DATEFIRST as w; --返回使用SET DATEFIRST 命令而被賦值的DATAFIRST ,用來指定每周的第一天是星期幾 select @@FETCH_STATUS as w; --返回上一次FETCH 語句的狀態(tài)值(0:成功,-1失敗或行超過結(jié)果集,-2行沒找到) select @@DBTS as w; --為當(dāng)前數(shù)據(jù)庫返回當(dāng)前 timestamp 數(shù)據(jù)類型的值。這一 timestamp 值保證在數(shù)據(jù)庫中是唯一的。 select @@ERROR; --返回最后執(zhí)行的 Transact-SQL 語句的錯(cuò)誤代碼(integer) (0,表示沒錯(cuò)誤;1,表示有錯(cuò)誤) select @@IDENTITY as w; --返回最后插入的標(biāo)識(shí)值 select @@IDLE as w; --返回SQL自上次啟動(dòng)后閑置的時(shí)間,單位為毫秒 select @@IO_BUSY as w; --返回SQL自上次啟動(dòng)后用于執(zhí)行輸入和輸出操作的時(shí)間,單位為毫秒 select @@LANGID as w; --返回當(dāng)前所使用語言的本地語言標(biāo)識(shí)符(ID)。 select @@LANGUAGE as w; --返回當(dāng)前使用的語言名 select @@LOCK_TIMEOUT as w; --當(dāng)前會(huì)話的當(dāng)前鎖超時(shí)設(shè)置,單位為毫秒。 select @@MAX_CONNECTIONS as w; --返回SQL上允許的同時(shí)用戶連接的最大數(shù)。返回的數(shù)不必為當(dāng)前配置的數(shù)值 select @@MAX_PRECISION as w; --返回 decimal 和 numeric 數(shù)據(jù)類型所用的精度級(jí)別,即該服務(wù)器中當(dāng)前設(shè)置的精度。默認(rèn)最大精度38。 select @@OPTIONS as w; --返回當(dāng)前 SET 選項(xiàng)的信息。 select @@PACK_RECEIVED as w; --返回SQL自啟動(dòng)后從網(wǎng)絡(luò)上讀取的輸入數(shù)據(jù)包數(shù)目。 select @@PACK_SENT as w; --返回SQ自上次啟動(dòng)后寫到網(wǎng)絡(luò)上的輸出數(shù)據(jù)包數(shù)目。 select @@PACKET_ERRORS as w; --返回自SQL啟動(dòng)后,在SQL連接上發(fā)生的網(wǎng)絡(luò)數(shù)據(jù)包錯(cuò)誤數(shù)。 select @@ROWCOUNT as w; --返回上一次語句影響的數(shù)據(jù)行的行數(shù) select @@SERVERNAME as w; --返回運(yùn)行SQL服務(wù)器名稱。 select @@SERVICENAME as w; --返回SQL正在其下運(yùn)行的注冊(cè)表鍵名 select @@TIMETICKS as w; --返回SQL服務(wù)器一刻度的微秒數(shù) select @@TOTAL_ERRORS as w; --返回 SQL服務(wù)器自啟動(dòng)后,所遇到的磁盤讀/寫錯(cuò)誤數(shù)。 select @@TOTAL_READ as w; --返回 SQL服務(wù)器自啟動(dòng)后讀取磁盤的次數(shù)。 select @@TOTAL_WRITE as w; --返回SQL服務(wù)器自啟動(dòng)后寫入磁盤的次數(shù)。 select @@TRANCOUNT as w; --返回當(dāng)前連接的活動(dòng)事務(wù)數(shù)。 select @@VERSION as w; --返回當(dāng)前安裝的SQL Server 的日期版本處理器
局部變量
局部變量的用途
- 在循環(huán)中記錄循環(huán)次數(shù)
- 儲(chǔ)存存儲(chǔ)過程或者函數(shù)的返回值
局部變量的聲明
局部變量的聲明必須以"DECLARE"作為關(guān)鍵字,變量的命名必須以"@"作為變量名的第一個(gè)字符,必須為所聲明的變量提供一個(gè)數(shù)據(jù)類型和數(shù)據(jù)長度。
如:
DECLARE @Name nvarchar(20)
注意:局部變量的數(shù)據(jù)類型不能為Text,ntext,和Image類型,當(dāng)對(duì)于字符型變量只提供數(shù)據(jù)類型沒有提供數(shù)據(jù)長度時(shí),數(shù)據(jù)長度默認(rèn)為1.
設(shè)置變量中的值(賦值)
有兩種設(shè)置變量值方法??梢允褂肧ELECE語句或者SET語句。從功能上看,它們的作用幾乎是相同的,不同的是SELECT語句允許元數(shù)據(jù)值來自SELECT語句中的某一列。
1、使用SET設(shè)置變量
DECLARE @i int,@j int set @i = 10; set @j = 20; select @i + @j
用查詢到的值設(shè)置變量:
DECLARE @i int SET @i = (select MAX(Age) from Person) --當(dāng)使用SET時(shí)如果返回結(jié)果有多行也會(huì)報(bào)錯(cuò)。同時(shí)如果返回多條記錄也報(bào)錯(cuò) SELECT @i
2、使用SELECT設(shè)置變量:
當(dāng)變量中存儲(chǔ)的信息來源于查詢時(shí),經(jīng)常使用SELECT給變量賦值,語法比較簡便。
DECLARE @i int SELECT @i = 100 SELECT @i
查詢的信息為變量賦值:
DECLARE @i int SELECT @i = Age from Person_1 order by Id desc --當(dāng)返回多個(gè)值時(shí)用最后一個(gè)賦值 PRINT @i
SELECT同時(shí)設(shè)置多個(gè)值:
DECLARE @Name varchar(20) DECLARE @i int SELECT @i = 10, @Name = '張飛'
3、當(dāng)表達(dá)式未返回值時(shí)
- 使用SET對(duì)局部變量賦值時(shí),如果賦值表達(dá)式未返回值,則局部變量變?yōu)镹ULL;而SELECT對(duì)表達(dá)式賦值時(shí),如果表達(dá)式未返回值,則局部變量保持原值。
- 一切只聲明沒有賦值的局部變量的初始值都為”NULL”。
例如:
DECLARE @Name nvarchar(50) SET @Name = '黃飛鴻' select @Name = Name from Person_1 where Id = 100 --100不存在記錄,此處如果改為一個(gè)Id存在的,且Name列不為null的值,則@Name變量的值就變了 PRINT @Name --依然打印的是黃飛鴻
可見,當(dāng)SELECT表達(dá)式賦值時(shí),如果為返回值,則保持原值。
局部表變量
局部表變量是一個(gè)特殊的局部變量。和臨時(shí)表不同,局部表變量具有一切局部變量的特點(diǎn)。在查詢中,因?yàn)榫植勘碜兞渴谴嬖趦?nèi)存中,而不是硬盤中,所以速度會(huì)遠(yuǎn)遠(yuǎn)快于臨時(shí)表或是實(shí)際表。局部表變量最多的使用是在查詢中充當(dāng)多個(gè)表做連接時(shí)的中間表。
DECLARE @TempTable TABLE --聲明一個(gè)局部表變量 ( Id int, Name nvarchar(50) ) INSERT INTO @TempTable --用查詢到的作為數(shù)據(jù)插入到局部表變量 SELECT Id,Name FROM Person_1 SELECT * FROM @TempTable --和普通表一樣用,可以各種join,子查詢等等。
到此這篇關(guān)于SQL Server在T-SQL語句中使用變量的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。