我需要根据可变数量的行来转移数据,并将总行数作为列应用,以便创建规范化矩阵。
我需要在别处引用它的输出,所以我试图将这个动态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
答案 0 :(得分:0)
这里的问题是#Matrix表定义中的IDENTITY(1,1)
。删除它允许该过程按预期运行。
答案 1 :(得分:0)
尝试执行以下操作
...
CREATE TABLE #Matrix
(
RowID INT --IDENTITY(1,1)
)
...
WHILE @iCount <= (SELECT MAX(RowID) FROM #Input) -- + 1
...