TSQL 使用動態sql 將查詢結果存入變數資料表

  • 3251
  • 0

寫入資料表變數時,使用動態SQL,其中包含「變數資料表」及「動態資料表名稱」時的執行方法。
Insert into @variableTable with Dynamic SQL

因為要在查詢資料表變數時使用動態資料表,嘗試的結果,只能用sq_executesql處理,無法直接用exec (@sqlStr)

做法:

1.因為在外部及sq_executesql裡會用到相同格式的資料表變數,不想寫兩次一模一樣的資料表宣告,
請先建立資料表type,並先Go產生備用。
(Go之後才會產生type,才能被使用。建議放在其它變數宣告之前,避免影響其它變數無法使用。)
(如果會重覆使用,請每次檢查並drop type)

/*用來建立暫存資料表變數,以及建立sq_executesql 內暫存表用*/
create type typeMyTable as table
(
    [Log_Id] [int],
    [Display] [varchar](20) NULL,
    [Write_Time] [datetime] NOT NULL
)
GO

/*最後用來接輸出的資料表格式*/
create type typeOutTable as table
(
    [Log_Id] [int],
    [Display] [varchar](20) NULL,
    [Location] [varchar](20) NULL
)
GO

2.使用type建立等一下要傳入sp_executesql裡面的資料表。

/*建立資料表變數;在SQL中有很多步驟時,常常就會用到資料表變數*/
Declare @tempMyTBL typeMyTable 

/*產生模擬資料*/
Insert @tempMyTBL
Select * from someTable 

3.產生動態SQL,這裡包括了
①使用資料表變數 @innerTempMyTBL
②使用字串傳入的資料表名稱 @dynaVarTbl

Declare @sqlStr nvarchar(max), @dynaVarTbl nvarchar(20)='dynaTableName'

Set @sqlStr='
select M.Log_ID,M.Display, D.Location
From @innerTempMyTBL M
Left join '
+ @dynaVarTbl + ' D
On M.Log_ID=D.Log_ID
'
;

4.因為使用了上項的①跟②,因此使用sp_executesql執行詢,無法使用 exec(@sqlStr) 的方式執行。

/*利用type建立輸出用的資料表變數*/
Declare @outTable typeOutTable 

/* 宣告@sqlStr內的@innerTempMyTBL變數,並將@tempMyTBL傳進去 */
insert into @outTable 
Execute sp_executesql @sqlStr,N'@inner @innerTempMyTBL typeMyTable readonly',@tempMyTBL

於是就把處理結果寫到@outTable了