将动态SQL执行到临时表

时间:2017-11-21 17:26:16

标签: sql-server tsql sql-server-2012

我需要根据可变数量的行来转移数据,并将总行数作为列应用,以便创建规范化矩阵。

我需要在别处引用它的输出,所以我试图将这个动态SQL执行到临时表中供以后使用。

除了必须创建一个表来容纳动态SQL的预期输出之外,当我创建一个与输出相同的表结构并尝试EXEC sp_executesql @SQLQuery时,我无法这样做,除非我添加了一个额外的列。

  

Msg 213,Level 16,State 7,Line 1
  列名或提供的值数与表定义不匹配。

所以我在这里添加了一个+1,我可以运行EXEC语句,但它在标有“1”的列中重复了RowID

 WHILE @iCount <= (SELECT MAX(RowID) FROM #Input) + 1

我在这里做错了什么想法?

完整程序:

if OBJECT_ID(N'tempdb..#Input') is not null drop table #Input
if OBJECT_ID(N'tempdb..#Matrix') is not null drop table #Matrix

CREATE TABLE #Input 
(
    RowID INT,
    ColumnID INT,
    Val FLOAT
)

CREATE TABLE #Matrix
(
     RowID INT IDENTITY(1,1)
)

INSERT INTO #Input
VALUES (1, 1, 0.96), (1, 2, -0.036), (2, 1, -0.034), (2, 2, 0.97)

DECLARE @iCount INT=1

--Alter table to include columns that allow for executing dynamic sql into temp table
WHILE @iCount <= (SELECT MAX(RowID) FROM #Input) + 1     --I don't want to add this third column, but SQL fails otherwise
BEGIN
    EXEC('ALTER TABLE #Matrix ADD [' + @iCount +'] FLOAT')

    SELECT @iCount = @iCount + 1
END

--Create dynamic SQL to populate Matrix
DECLARE @PivotColumns as NVARCHAR(MAX)
DECLARE @SQLQuery as NVARCHAR(MAX)

SELECT @PivotColumns=coalesce(@PivotColumns +',','') +QUOTENAME(ColumnID)
FROM (Select DISTINCT ColumnID FROM #Input) as A


SELECT * FROM #Input
Set @SQLQuery=
    N'Select RowID,' + @PivotColumns + '
    FROM #Input
    PIVOT(MAX(Val)
      FOR ColumnID IN(' + @PivotColumns + ')) as P'

--display the dynamic sql results
EXEC sp_executesql @SQLQuery

--now place this same sql into the table created above
INSERT INTO #Matrix EXEC (@SQLQUERY)

--and display. Why the difference?
select * from #Matrix

2 个答案:

答案 0 :(得分:0)

这里的问题是#Matrix表定义中的IDENTITY(1,1)。删除它允许该过程按预期运行。

答案 1 :(得分:0)

尝试执行以下操作

...
CREATE TABLE #Matrix
(
     RowID INT --IDENTITY(1,1)
)
...
WHILE @iCount <= (SELECT MAX(RowID) FROM #Input) -- + 1
...