从动态sql访问动态表

时间:2013-12-09 14:45:20

标签: sql sql-server dynamic-sql temp-tables sp-executesql

美好的一天StackOverflow

我从动态sql创建的表可以包含任意数量的列,因为它是数据透视表。

-- Pivot the table so we get the UW as columns rather than rows
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = '
SELECT *
FROM #PreProcessed
PIVOT (SUM(Quotes)
        FOR [UW] IN (' + @UWColumns + ')
        ) AS bob'

我运行此代码来运行我的动态sql。

EXEC sp_executesql @SQL,
                  N'@UWColumns nvarchar(MAX)',
                  @UWColumns

我的问题是,如何存储结果表?特别是当我不知道它将包含多少列,甚至不知道要调用哪些列时?

我尝试了下面的代码,但它不起作用

   INSERT INTO #Temp
   EXEC sp_executesql @SQL,
                  N'@UWColumns nvarchar(MAX)',
                  @UWColumns

谢谢大家

2 个答案:

答案 0 :(得分:0)

SQL Server使用SELECT * INTO ....,而不是CREATE TABLE AS语法。因此,您需要将动态sql修改为:

 SELECT * INTO <YOUR TABLE>
    FROM #PreProcessed
    PIVOT (SUM(Quotes)
            FOR [UW] IN (' + @UWColumns + ')
            ) AS bob'

答案 1 :(得分:0)

我能找到解决此问题的唯一方法是在动态sql中执行所有计算。这意味着我必须在两张桌子上工作。

-- Pivot the table so we get the UW as columns rather than rows
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = '
SELECT * INTO #temp
FROM #PreProcessed
PIVOT (SUM(Quotes)
        FOR [UW] IN (' + @UWColumns + ')
        ) AS bob

SELECT DISTINCT t1.Date, d.Declines AS ''Declines'' , '+@UWColumns+'
FROM #temp AS t1 LEFT OUTER JOIN
#Declines AS d ON t1.DATE = d.DATE
'

PRINT @SQL

EXEC(@SQL)