iT邦幫忙

DAY 29
13

T-SQL 應用之美系列 第 29

如何動態組出 T-SQL 指令(上)

由於變數(請參考:「如何在 T-SQL 中宣告變數」)只能用在運算式中,不能用來取代物件名稱或是關鍵字,所以如果要動態組出 SQL 陳述式,可以使用 EXECUTE 陳述式。
SQL Server 擴充了 EXECUTE 陳述式的功能,讓我們可以把要執行的 T-SQL 傳給 SQL Server,最重要的是,所要執行的 T-SQL 的內容,可以透過動態的方式來設定。

假設我們要動態組出 T-SQL,從 AdventureWorks 資料庫中的 Production.Product 資料表內,找出「顏色」是黑色的產品,可以使用下面的程式碼:

USE AdventureWorks
GO

-- 宣告變數
DECLARE @SQLCommand nvarchar(200)
DECLARE @columnList nvarchar(50)
DECLARE @color varchar(10)

-- 定義變數
SET @columnList = N'ProductID 產品編號, Color 顏色'
SET @color = '''Black'''

-- 動態組出 T-SQL
SET @SQLCommand = 'SELECT ' + @columnList + ' FROM Production.Product WHERE Color = ' + @color

-- 執行動態組出的 T-SQL
EXECUTE (@SQLCommand)

執行的部分結果畫面:

大家應該有注意到,在設定 @color 顏色變數時,在變數值的左右各用了 3 個單引號(')來把 Black 包起來,第 1 個單引號代表變數值的型別是 nvarchar 型別,第 2 與第 3 個單引號最後會被視為只有一個單引號。

另外,請務必在 EXECUTE 陳述式之後,用一對刮號把要執行的 T-SQL 給包起來,不然會發生如下圖的錯誤訊息:

如果想少打幾個字,可以將 EXECUTE 簡寫成 EXEC,就像下面這樣:

EXEC (@SQLCommand)

如果現在要再多加上一個查詢的限制條件,就是「產品編號」要小於 325:

USE AdventureWorks
GO

-- 宣告變數
DECLARE @SQLCommand nvarchar(200)
DECLARE @columnList nvarchar(50)
DECLARE @color varchar(10)
DECLARE @pID varchar(5)

-- 定義變數
SET @columnList = N'ProductID 產品編號, Color 顏色'
SET @color = '''Black'''
SET @pID = '325'

-- 動態組出 T-SQL
SET @SQLCommand = 'SELECT ' + @columnList + ' FROM Production.Product WHERE Color = ' + @color + ' AND ProductID < ' + @pID

-- 執行動態組出的 T-SQL
EXEC (@SQLCommand)

執行結果:

在宣告 @pID 時,雖然「產品編號」的型別是 int(請參考下圖),但是由於 @SQLCommand 是宣告成 nvarchar,所以就不能把 @pID 宣告成 int,只能宣告成文字(char、nchar、varchar、nvarchar ... 這幾種)。而為了減少所需的記憶體空間,就決定使用 varchar 型別。

「產品編號」的型別是 int:


上一篇
如何取得文數字的資料中,所有的數字的值
下一篇
如何動態組出 T-SQL 指令(下)
系列文
T-SQL 應用之美30

1 則留言

0
davidliu9116
iT邦研究生 3 級 ‧ 2008-12-28 08:24:33

請問如何將結果回傳給函數呢?
1.資料表值函數應用中應如何建立?
2.純量值函數應用中又應如何建立?

我要留言

立即登入留言