从动态查询中选择表格

时间:2017-02-15 10:01:41

标签: sql-server tsql

我想从@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)
)

这可能吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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_executesqlIt'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,因为如果您使用嵌套存储过程,它最终会导致以下错误:

  

Msg 8164,Level 16,State 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;

答案 2 :(得分: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 并使用相同的代码行。 希望这有帮助,见到你!