2021年4月28日 星期三

【SQL Server】使用sp_executesql 執行SQL語句

剛好工作上會用到,就順手來筆記一下~

因為維護的系統是個租用平台,所以,在建帳號時,會同步生成一個專屬的DB,以便和其他租用人的資料分開,然而,一樣的語法要在其他DB執行,就會感覺煩躁~

只查詢一個DB時,當然沒什麼,如果要切換並查看好幾個租用人的好幾個Table時,就會開始犯懶了,這時候sp_executesql就是好朋友了!



照著微軟的範例,把參數宣告改成自己要執行的語句即可,甚至搭配Cursor去傳參執行也是可以的

DECLARE @IntVariable INT; DECLARE @SQLString NVARCHAR(500); DECLARE @ParmDefinition NVARCHAR(500); /* Build the SQL string one time.*/ SET @SQLString = N'SELECT BusinessEntityID, NationalIDNumber, JobTitle, LoginID FROM AdventureWorks2012.HumanResources.Employee WHERE BusinessEntityID = @BusinessEntityID'; SET @ParmDefinition = N'@BusinessEntityID tinyint';

/* Execute the string with the first parameter value. */ SET @IntVariable = 197; EXECUTE sp_executesql @SQLString, @ParmDefinition, @BusinessEntityID = @IntVariable;

/* Execute the same string with the second parameter value. */ SET @IntVariable = 109; EXECUTE sp_executesql @SQLString, @ParmDefinition, @BusinessEntityID = @IntVariable;


如果是多個參數,參數宣告只要逗點隔開即可

DECLARE @IntVariable INT;

DECLARE @SQLString NVARCHAR(500); DECLARE @ParmDefinition NVARCHAR(500); DECLARE @max_title VARCHAR(30); SET @IntVariable = 197; SET @SQLString = N'SELECT @max_titleOUT = max(JobTitle) FROM AdventureWorks2012.HumanResources.Employee WHERE BusinessEntityID = @level'; SET @ParmDefinition = N'@level TINYINT, @max_titleOUT VARCHAR(30) OUTPUT'; EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT; SELECT @max_title;


雖然微軟範例都是要把值指給參數,但是,若是語句裡的參數名稱跟傳入的參數名稱一樣的話,不做指定也是可以如常執行的

EXECUTE sp_executesql @SQLString, @ParmDefinition, @BusinessEntityID;

沒有留言:

張貼留言