使用表行动态创建SQL列



我有一个摘录,看起来像这样

| 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)

最新更新