Home [SQL筆記] 變量-局部變量@、全局變量@@
Post
Cancel

[SQL筆記] 變量-局部變量@、全局變量@@

一、訊息輸出

  • print:直接在訊息中列印訊息
  • select:在結果表格中列印訊息,可以設置多列,以及每一列的名字
1
2
print 'hello'
select 'hello'

二、變量

變量:(1) 局部變量 (2) 全局變量

(1) 局部變量:

  • @開頭
  • 先聲明(宣告),再賦值
  • 聲明(宣告)declare 變數@str 數據類型varchar(20)
  • 再賦值set @str = 'I like sql'
1
2
3
4
declare @str varchar(20)
set @str = 'Hello sql'
--select @str='I love sql' --建議使用set賦值
print @str

有兩種方式可以給變量賦值:(1)set(2)select

(2) 全局變量:

  • @@開頭
  • 由系統進行定義和維護

常用的變量

  • @@ERROR:返回最後執行SQL語句的錯誤代碼
  • @@IDENTITY:返回最後插入的標識值。(可取得自動編號的值)
  • @@MAX_CONNECTIONS:返回允許同時進行的最大用戶連線數
  • @@ROWCOUNT:返回上一個語句影響的行數
  • @@SERVERNAME:返回運行SQL Server的本地服務器的名稱
  • @@SERVICENAME:返回SQL Server正在其下運行的註冊表項的名稱
  • @@TRANCOUNT:返回當前連接的活動事務數
  • @@LOCK_TIMEOUT:返回當前會話的當前鎖定超時設置(毫秒)

範例:局部變量&全局變量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
--(1) 局部變量:以`@`開頭,先宣告,再賦值
declare @str varchar(20)
set @str='I love sql'
--select @str='I love sql' --建議使用set賦值
print @str
--set和select進行賦值的區別
--set:賦值變量指定的值
--select:一般用於表中查詢出的數據賦值給變量,如果查詢結果有多條,取最後一條賦值
--exp: select @a = 欄位名 from 表名
--@a的值,會是當前表的最後一行的值給@a

--(2) 全局變量:以`@@`開頭,由系統進行定義和維護
--@@ERROR:返回執行的上一個語句的錯誤號
--@@IDENTITY:返回最後插入的標識值
--@@MAX_CONNECTIONS:返回允許同時進行的最大用戶連線數
--@@ROWCOUNT:返回上一個語句影響的行數
--@@SERVERNAME:返回運行SQL Server的本地服務器的名稱
--@@SERVICENAME:返回SQL Server正在其下運行的註冊表項的名稱
--@@TRANCOUNT:返回當前連接的活動事務數
--@@LOCK_TIMEOUT:返回當前會話的當前鎖定超時設置(毫秒)

範列1:開戶開卡

模擬銀行業務

1
2
3
4
5
6
7
8
9
10
11
12
13
--範列:
--(1)為趙雲此人進行開戶開卡操作,趙雲身份証:D123456789

--開戶
insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime)
values('D123456789','9922334455','趙雲',GETDATE())
--使用@@IDENTITY 取得自動編號的值
declare @AccountId int--先聲明
set @AccountId = @@IDENTITY--再賦值。將趙雲的自動編號(AccountCode)的值給@AccountId

--開卡
insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState)
values('999998888803',@AccountId,'123456',0,1)--@AccountId取得到的

開卡資料中,需要取得趙雲開戶後的AccountCode,因為AccountCode是自動編號,所以可以宣告變量@AccountId,透過全域變量@@IDENTITY賦值給 @AccountId,新增開卡的AccountId欄,就放@AccountId變量。

  • @@IDENTITY:返回最後插入的標識值
  • delete刪除一筆自動編號,那個編號會永久消失

範列2:求出王五的銀行卡卡號和餘額(子查詢/使用變量)

可以使用兩種方法:(1)子查詢 (2)使用變量

1
2
3
4
5
6
7
8
9
10
11
12
13
--(2)需要求出王五的銀行卡卡號和餘額,王五的身份証:C3344556677
select AccountId from AccountInfo where AccountCode = 'C3344556677'
--方法一:子查詢
select BankCard.CardNo 卡號, BankCard.CardMoney 餘額 from BankCard 
inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId
where AccountInfo.AccountCode = 'C3344556677'

--方法二:使用變量
--先透過變量找到AccountId
declare @AccountId int
select @AccountId = (select AccountId from AccountInfo where AccountCode = 'C3344556677')
--再透過@AccountId變量找出王五的銀行卡卡號和餘額
select CardNo 卡號, CardMoney 餘額 from BankCard where AccountId = @AccountId

三、Go語句

  1. 等待go語句之前代碼執行完成之後,才能執行後面的代碼
  2. 批次處理結束的一個標誌
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--go語句
--(1)等待go語句之前代碼執行完成之後,才能執行後面的代碼
create database DBTEST1 --建立資料庫
go--必須將DBTEST1建立完成之後,才能切換db,如果沒有加GO,資料庫還沒建立完成就切換DB,就會發生錯誤「資料庫'DBTEST1' 不存在。請確定名稱輸入正確。」
use DBTEST1 --切換DBTEST1資料庫
create table Student
(
    StuId int primary key identity(1,1),
    StuName varchar(20) not null
)

--(2)批次處理結束的一個標誌
declare @num int --@num作用範圍全局(這裡的全局指的是執行代碼的範圍)
set @num = 100
set @num = 200

加上一個go,@num作用範圍是在go之前

1
2
3
4
declare @num int --@num作用範圍是在go之前
set @num = 100
go
set @num = 200--報錯:必須宣告純量變數 "@num"。

加上二個go,@num1作用範圍是在兩個go之間

1
2
3
4
5
6
7
8
9
10
declare @num int
set @num = 100
set @num = 200

go
declare @num1 int --@num1作用範圍是在兩個go之間
set @num1 = 100

go
set @num1 = 200--報錯:必須宣告純量變數 "@num1"。
This post is licensed under CC BY 4.0 by the author.