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