使用 Table 行动态创建 SQL 列
Dynamically Create SQL Columns using Table Rows
我有一个看起来像这样的摘录
| 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 个属性,然后创建一个 table 具有 ID、名称、属性 1、值 1 , 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'.
构建 Table 后,我需要一个类似的循环来填充字段。
如有任何帮助,我们将不胜感激。
更新:我不知道更新 OP 是否是这里公认的做法。如果有不同的方法,请指正。
感谢您在下面的帮助,将@SQL 包裹在() 中已经奏效。我现在有一个 table 添加了 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)
我有一个看起来像这样的摘录
| 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 个属性,然后创建一个 table 具有 ID、名称、属性 1、值 1 , 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'.
构建 Table 后,我需要一个类似的循环来填充字段。 如有任何帮助,我们将不胜感激。
更新:我不知道更新 OP 是否是这里公认的做法。如果有不同的方法,请指正。
感谢您在下面的帮助,将@SQL 包裹在() 中已经奏效。我现在有一个 table 添加了 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)