剛好工作上會用到,就順手來筆記一下~
因為維護的系統是個租用平台,所以,在建帳號時,會同步生成一個專屬的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;
沒有留言:
張貼留言