T-SQL筆記1_變數之宣告與賦值_區域VS全域變數_打印_串接(字串)_變數四則運算_Batch_CAST運算_判別式_迴圈

T-SQL變數之宣告與打印

在T-SQL程式語法中定義變數名稱時
習慣在前方加上@符號(讀作: at) 若宣告時沒給值則預設為NULL
T-SQL變數使用上通常就類似一般程式語言用途
你可能用他作一些變數存放
可能作一些迴圈的計數或流程切換等用途
或是存取藉由預存程序(Stored proceddure)或函式(functon)所回傳之資料數值

此外當你在做變數命名時請勿用到保留字(Keyword)
https://technet.microsoft.com/zh-tw/library/ms189822(v=sql.105).aspx


T-SQL是否也存有  所謂區域變數與全域變數的觀念呢???

在 Microsoft SQL Server 當中,把所有的變數都當成區域變數,換言之,
所宣告的變數只可在同一個批次、預存程序或該變數所定義的區塊中做使用。

當然你在操作變數時
當你打上  @開頭後
你會發現 Management Studio 的 IntelliSense(自動陳列語法提示)


其實阿 在較早版本的 MS SQL  針對T-SQL變數這塊相關文件中有提到
若想要將宣告之變數歸類為 global variables 則在前頭加上兩個@符號即可

比方像是
@@ROWCOUNT
@@IDLE
事實上這是有誤解的!!!這些都是 系統函式而非全域變數!!!
在官方網頁上也可以看到這類敘述章節是被歸類於函式部分的
https://docs.microsoft.com/zh-tw/sql/t-sql/functions/rowcount-transact-sql




T-SQL之字串串接(+)與強制轉型(CAST)

在我們嘗試給輸出結果前方加上一串字串時
會出現的常遇錯誤



此時使用之 +  通常是實作 String 的 Concatenation 功能
所以必須對int型態之變數做強制轉型(CAST運算)



那剛剛我們已經知道如何宣告變數並且同時賦予數值
現在來示範 中途才賦值的語法

T-SQL變數之宣告與中途賦值(SET)/(SELECT)



中途指派數值給變數除了用SET
也可以指派比方 SELECT 回傳回來的結果(E.g. COUNT() ,MAX() ...etc)


以下我們就拿  Sales.SalesOrderDetail 這張表結構
來做示範



我們利用 COUNT 取 LineTotal 這欄位總資料筆數有多少


可以透過
SELECT 變數名稱 = <Query陳述式>
做值的暫存

<Query陳述式>  通常搭配 COUNT ,SUM,MAX,MIN,...等等做應用





T-SQL變數之四則運算

T-SQL多個變數之宣告
如下我們在示範一組當我們同時要宣告多個變數時
可以只使用一句DECLARE 語句
被宣告並賦予數值的這些變數可以做
變數之四則運算
Batch(批次)

捨麼是batch呢??
batch 可以說是同一時間點被發送自應用程式出來的一整群T-SQL statemets(一或以上個)
用來給SQL Server 執行

SQL Server去編譯這些batch的 statements
變為單一可執行的單元,又稱作「執行計畫」(execution plan)

執行計畫中這些陳述式群集 會同一時間被執行。
===================================================================
T-SQL Batch 使用上一些叮嚀:

1.有些CREATE陳述語句不可於同一個batch檔案中被其他陳述給結合
(Some CREATE statement cannot be combined with other statements in a batch)

2.CREATE statement 必須驅動batch
(The CREATE statement must start the batch)

3.一個table 不可被變動或新增參考自同樣batch的資料欄位
(A table cannot be changed and then the new columns referenced in the same batch)

4.如果batch檔案中第一句陳述式 以EXECUTE作為開端 ,則可省略多餘EXECUTE保留字。
(If an EXECUTE statement is the first statement in a batch, the EXECUTE keyword is not required.)

5.每一個區域變數使用範圍上都是以GO指令作為下一次新開端(一個batch之結尾)
(Local variables are scoped to the batch , they can no longer be referenced after a GO command)
===================================================================
GO command
The GO command is used to signal the end of a batch.
GO is not a T-SQL statement
It simple tells the Management Studio Environment how many SQL statements should be included
in a batch.

===================================================================
如下我們來示範一段陳述式表達函意會因為
有無GO指令而有所差異


比方宣告完一個變數之後做打印
一般我們會滑鼠全選這一區塊做執行
這就視同在同一批次(Batch)的Scope中



此時我們就可以發現GO
已經將 @varTest這個Local變數作用範圍切割為不同Scope
也就是GO下方已經視為新的一個Batch來執行之緣故



在來一個淺顯易懂的一個T-SQL例子






T-SQL之判別式

型1.
IF <boolean expression>
    <SQL statement>

型2.
IF <boolean expression>
    <SQL statement>
ELSE
    <SQL statement>


<SQL statement>
==>通常如果IF 或者 ELSE 下方所函之陳述語句不只一條,兩條、三條(一條以上)
上下會用 BEGIN ... END 包起來

就像寫 C 或JAVA 加一組大括號一樣概念

if ( condition )
{
    statement1
     ....
    tatementN
}

這邊我們來舉一個 依照某一商品之銷售量多寡
抉擇是否給予10%折扣的優惠

在此 OrderQty 是指每一筆訂單量
我們去取總和


Sales.SalesOrderDetail




所以目前這個商引總銷量只有634

我們就故意設定  達到700才有折扣的條件判定
(未達到)



如果設為500則就達到
(已達到)


GOTO 語句  跳至特定分枝標籤下方區塊

講到  If 條件判別分枝
就有需要在多認識  GOTO 語法

以下來示範一個


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
DECLARE @Counter int;
SET @Counter = 3;

IF @Counter < 3 GOTO Completed
IF @Counter = 3 GOTO Branch_One
IF @Counter = 4 GOTO Branch_Two
IF @Counter = 5 GOTO Branch_Three
IF @Counter > 5 GOTO Completed

Branch_One:
 PRINT 'This is Branch 1.'
 GOTO Completed; --To avoid to execute Branch_Two and Branch_Three blocks
Branch_Two:
 PRINT 'This is Branch 2.'
 GOTO Completed;--To avoid to execute Branch_Three blocks
Branch_Three:
 PRINT 'This is Branch 3.'

Completed:
 PRINT 'Continue with code...'


於 SQL Management Studio IDE 中我們可以去偵錯(DEBUG)
逐步去執行模擬程式之運行




@Counter =3時會判斷到

IF @Counter = 3 GOTO Branch_One
條件吻合所以跳至

Branch_One 標籤(號誌)下方陳述式區塊做執行

之後再跳到 Completed 下方區塊

其餘以此類推......


T-SQL之迴圈










留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header