我有一个摘录,看起来像这样
| ID | NAME | ATTRIBUTE | VALUE |
| 1 | PENCIL | TYPE | HB2 |
| 1 | PENCIL | COLOR | RED |
| 1 | PENCIL | MADE IN | JAPAN |
| 1 | PENCIL | HAS ERASER| YES |
| 2 | LIGHT | WATTS | 60 |
| 2 | LIGHT | COLOR | WHITE |
| 3 | BOOK | NAME | HELLO |
| 3 | BOOK | WEIGHT | 200G |
| 3 | BOOK | ISBN | 901551 |
我需要一个循环的帮助,可以计算一个ID的最大属性数,在这个例子中,Pecil有4个属性,然后创建一个表,有ID, Name, Attribute1, Value1, Attribute2, Value2, Attribute3, Value3, Attribute4, Value4。
如果一个产品只有2个属性,那么属性和值3和4将为空。
| ID | NAME | ATTRIBUTE1 | VALUE1 | ATTRIBUTE2 | VALUE2 | ATTRIBUTE3 | VALUE3 |
| 1 | PENCIL | TYPE | HB2 | COLOR | RED | MADE IN | JAPAN | ...etc
| 2 | LIGHT | WATTS | 60 | COLOR | WHITE | | |
| 3 | BOOK | NAME | HELLO | WEIGHT | 200G | ISBN | 901551 |
我还在尝试动态添加列。
DECLARE @RunningTotal BIGINT = 1;
DECLARE @MAXAttributeCnt BIGINT = (SELECT MAX(cnt) FROM (SELECT ID,count(1) as cnt FROM Table1 group by ID ) x);
WHILE @RunningTotal <= @MAXAttributeCnt
BEGIN
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = 'ALTER TABLE Table1
ADD ATTRIBUTE' + CAST(@RunningTotal as varchar(10)) + ' BIGINT NULL'
EXECUTE (@SQL)
SET @RunningTotal = @RunningTotal + 1
END
但这不起作用。我得到了一些
的循环> Could not find stored procedure 'ALTER TABLE Table1 ADD ATTRIBUTE1 BIGINT NULL'.
一旦表被构建,我将需要一个类似的循环来填充字段。如有任何帮助,不胜感激。
UPDATE:我不知道更新OP在这里是否被接受。如果有不同的方法请纠正我。
感谢下面的帮助,在()中包装@SQL已经工作了。我现在有一个表,添加了4个属性和4个值列,都是动态命名的。然而,我仍然需要填充属性和值。有人知道这是怎么回事吗?这就是我现在所拥有的,全部为空,直到VALUE4。
| ID | NAME | ATTRIBUTE | VALUE | ATTRIBUTE1 | VALUE1 | ATTRIBUTE2 |...
| 1 | PENCIL | TYPE | HB2 | NULL | NULL | NULL |...
| 1 | PENCIL | COLOR | RED | NULL | NULL | NULL |...
| 1 | PENCIL | MADE IN | JAPAN | NULL | NULL | NULL |...
| 1 | PENCIL | HAS ERASER| YES | NULL | NULL | NULL |...
| 2 | LIGHT | WATTS | 60 | NULL | NULL | NULL |...
| 2 | LIGHT | COLOR | WHITE | NULL | NULL | NULL |...
| 3 | BOOK | NAME | HELLO | NULL | NULL | NULL |...
| 3 | BOOK | WEIGHT | 200G | NULL | NULL | NULL |...
| 3 | BOOK | ISBN | 901551 | NULL | NULL | NULL |...
您的错误是因为您正在使用EXEC @SQL,但EXEC执行存储过程,而您只是给它一个SQL命令。您应该使用存储过程sp_executesql来运行如下SQL命令:
EXECUTE sp_executesql @SQL
或者正如Charlieface在下面指出的那样,您可以像这样将@SQL包装在括号中:
EXECUTE (@SQL)