2013-12-09 42 views
0

美好的一天StackOverflow从动态sql访问动态表

从我的动态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 

谢谢大家

+0

您可能需要创建一个真正的表格。在'sp_exectutesql'之外创建的临时表将在in中有作用域,但其中创建的任何临时表(临时表,变量等)将在作用域返回到调用代码时解除分配。所以,动态SQL创建一个表,以及动态SQL来填充它。或者,重新考虑您的代码以使用源(标准化)数据。 – MatBailie

回答

0

SQL Server使用SELECT * INTO ....,而不是在CREATE TABLE AS语法。所以你需要修改你的动态SQL:

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

嗨,感谢您的帮助,但我收到此错误: 消息208,级别16,状态0,行35 无效的对象名称'#temp'。 – Bobby

+0

哦,没有赶上那里的表变量。我不知道你会怎么做,因为你必须声明变量。你为什么试图将结果保存在临时表中? – Andrew

+0

我正在撰写相当复杂的报告,我需要为我正在制作的数据添加更多信息。不幸的是,这一切将被包裹到一个sp,需要运行时,永远。我的同事建议使用第二张表并加入我的日期列 – Bobby

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'' , '[email protected]+' 
FROM #temp AS t1 LEFT OUTER JOIN 
#Declines AS d ON t1.DATE = d.DATE 
' 

PRINT @SQL 

EXEC(@SQL)