2017-02-15 133 views
0

我想從@query中選擇表格變量。從動態查詢中選擇表格

這裏是@query

SELECT @QUERY = 'SELECT DISTINCT USER_KEY, (SELECT TOP(1) USER_FNM FROM BAUSER WHERE BAUSER.USER_KEY = PIVOT_LOCATIONS.USER_KEY), ' + @COLDEPSUMMARY + ' 
FROM CAUSDE_TAS 
PIVOT 
(
SUM(USDE_HSU) 
FOR DEPA_KEY IN (' + @COLDEPARTMENTS + ') 
) PIVOT_LOCATIONS 
WHERE USDE_DAT >= ''' + format(@DATEFROM, 'MM.dd.yyyy') + ''' AND USDE_DAT <= ''' + format(@DATETO, 'MM.dd.yyyy') + ''' 
AND USER_KEY IN (' + @USERS_STR + ') 
GROUP BY USER_KEY' 


EXECUTE (@QUERY) 

我想要做的是從EXECUTE(@QUERY)得到的結果,並將這些結果到臨時表@USERS

DECLARE @USERS TABLE 
(
    USER_KEY INT, 
    USER_FNM VARCHAR(50), 
    USDE_HSU DECIMAL(8,2), 
    [110000003] DECIMAL(8,2), 
[120000002] DECIMAL(8,2), 
[120000003] DECIMAL(8,2), 
[120000004] DECIMAL(8,2), 
[120000005] DECIMAL(8,2), 
[120000006] DECIMAL(8,2), 
[120000007] DECIMAL(8,2), 
[120000008] DECIMAL(8,2) 
) 

這可能嗎?

+0

爲什麼使用動態SQL?在這種情況下,似乎沒有必要。沒有動態SQL,你可以使用標準的'SELECT ... INTO'語句。 –

+1

@TaylorBuchanan - 抱歉,從示例中不可見,但有大約80列。我正在動態生成它們。 (這是動態生成結果的一部分。我沒有粘貼所有列,這將是不必要的併發症)。 – FrenkyB

回答

1

應儘可能簡單

INSERT INTO @USERS 
EXECUTE(@QUERY) 

既然你已經提前所有適當的聲明。

例子:

declare @something table (
someint int 
) 

declare @query varchar(max); 

select @query = 'select 1 
union all 
select 2'; 

insert into @something (someint) 
execute(@query) 

select * from @something 

息率

someint 
     1 
     2 
+0

如果表中有一些查詢未返回的列,該怎麼辦?表和查詢應該總是有相同的列?我的意思是 - 是否有一種方法可以返回將NULL置於不屬於查詢部分的列中,但它是表的一部分? – FrenkyB

+0

正如你在我的例子中看到的那樣,我指定了插入哪些列。它的工作原理與通過查詢獲取值正常插入一樣。 – Tobb

0

如果您打開表變量到一個臨時表,你可以在同一批次的動態SQL中插入它。這避免了下一節中列出的將來可能出現的錯誤。

CREATE TABLE #USERS (...); 

DECLARE @SQL NVARCHAR(MAX) = N' 
    INSERT #USERS (USER_KEY, ...) 
    SELECT USER_KEY, ' + @COLDEPSUMMARY + N', ...'; 

EXEC sp_executesql @SQL, N'@DATEFROM DATE, @DATETO DATE, ...', @DATEFROM, @DATETO, ...; 

您還會注意到我用sp_executesql代替。 It's generally a bad practice to use EXEC instead of sp_executesql。您將無法使用動態列部分的參數,但您至少可以使用它來傳遞其他參數,例如@DATEFROM@DATETOYou can also pass your other parameter @USERS_STR if you convert to a table type beforehand


正如前面提到的,我建議不要使用INSERT....EXEC如果可能的話,因爲它可以利用它最終導致下面的錯誤,如果你有一個嵌套的存儲過程都:

消息8164,級別16,狀態1

INSERT EXEC語句不能嵌套。

實施例:

CREATE PROC#Test1 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CREATE TABLE #Test1 (A INT); 

    INSERT #Test1 
    EXEC('SELECT 1') 
END; 
GO 
CREATE PROC#Test2 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CREATE TABLE #Test2 (B INT); 

    INSERT #Test2 
    EXEC#Test1 
END; 
GO 
EXEC#Test2; 
0

必須使用表用作例如:

create FUNCTION [dbo].[Get_Some_Table] (
    @Id int 
) 

RETURNS @tbResults TABLE (
    uId uniqueidentifier, 
    sType VARCHAR(5), 
    sCode VARCHAR(50) 
) 

AS 

BEGIN 

    -- select, insert into, create various @tables ecc... 

    RETURN 

END 

GO 

然後使用:

INSERT INTO @tb (uId, sType, sCode) SELECT uId,sType,sCode FROM dbo.Get_Same_Table(@id) 

這防止NESTED INSERT EXEC和使用相同的林代碼。 希望這有助於,看到你!