由於變數(請參考:「如何在 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:
請問如何將結果回傳給函數呢?
1.資料表值函數應用中應如何建立?
2.純量值函數應用中又應如何建立?