【问题标题】:Procedure to create a table with a variable number of columns创建具有可变列数的表的过程
【发布时间】:2013-08-29 18:25:52
【问题描述】:

我正在尝试创建一个存储过程,该过程将创建一个临时表 A,其列将取决于另一个表 B 的行数。这样做的背景是我允许用户创建自己的'groups',关于组的信息将存储在表 B 中。表 A 的创建将查看表 B 中的行数,并为表 B 中的每个组创建一个列(使用表 B 作为表 A) 中的列名。我无法反转轴(轴?),因为行将是我系统中每个用户的条目,这也是可变的。

总而言之:我将如何创建一个过程来创建具有可变列数的临时表?

谢谢。

【问题讨论】:

    标签: sql-server sql-server-2012


    【解决方案1】:
    DECLARE @sSQL varchar(max),
      @ColumnName CHAR(128)
    
    DECLARE TableCursor CURSOR FOR
      SELECT ColumnName FROM GroupTable
    
    SET @sSQL = 'CREATE TABLE ##NewTempTable ('
    
    OPEN TableCursor
    
    FETCH NEXT FROM TableCursor INTO @ColumnName
    
    WHILE @@FETCH_STATUS = 0
    BEGIN 
    
    SET @sSQL = @sSQL + RTRIM(@ColumnName) + ' CHAR(10) ,'
    
    FETCH NEXT FROM TableCursor INTO @ColumnName
    
    END
    
    CLOSE TableCursor
    
    DEALLOCATE TableCursor
    
    SET @sSQL = @sSQL + ')'
    
    EXEC (@sSQL)
    
    SELECT * FROM ##NewTempTable
    

    我希望这会有所帮助。在 DECLARE CURSOR 中,您需要将“ColumnName”和“TableName”更改为您正在查询的实际列/表。

    【讨论】:

    • 请不要在您的答案中添加签名。
    • 啊,太棒了。这就是我一直在寻找的:将任意代码作为字符串运行的能力。这么晚才回复很抱歉。我唯一需要添加的是 @Column 变量的几个验证/替换语句,以确保我提取的数据适合列名(例如,用下划线替换空格)
    【解决方案2】:

    您不应该这样做 - 相反,将组名也设为表 A 中的一列。

    【讨论】:

    • 要明确,您的解决方案是将表 B 中的所有组名汇集到表 A 中的一列? SQL 中根本没有办法为表 A 中的表 B 中的每个组创建单独的列?
    • 是的,没错。我确信有办法做到这一点,但它违背了 SQL 的本质,拥有这样的变量表定义,因为如果不动态指定列名,就很难或不可能编写查询。还可以想象编写查询来计算不同类别组的指标,或将组名称上的不同表连接在一起是多么困难。
    • 构建一个动态的#temp 表并在以后引用它也非常麻烦,因为一旦执行创建它的动态代码,它就不再存在。因此,所有后续代码都必须位于同一动态 SQL 块中。呸。你确定你需要一个临时表吗?也许不是问如何完成动态创建的临时表,而是问如何解决您要解决的实际问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多