【问题标题】:use query output as column name in sql sever在 sql server 中使用查询输出作为列名
【发布时间】:2013-05-28 12:25:36
【问题描述】:

我在 SQL Server 2008 方面的知识有限,我找不到确切的方法。我的想法是使用 SELECT 过程的结果作为列名列表(基于在这个老问题 How do you return the column names from a table? 中创建的过程)我想做类似的事情:

INSERT INTO new_table (SELECT COLUMN_NAME,* FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA='YourSchemaName')
SELECT (SELECT COLUMN_NAME,* FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YourTableName' AND TABLE_SCHEMA='YourSchemaName') FROM YourTableName

我想要做的是用列数较少的表中的数据填充一个更大的表(所有列都包含在更大的表中)。也许有更好的方法来做到这一点。

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    你不能这样做,这样。您必须使用动态 SQL 来执行此操作,如下所示:

    DECLARE @NewTablecols AS NVARCHAR(MAX);
    DECLARE @query AS NVARCHAR(MAX);
    
    
    select @NewTablecols = STUFF((SELECT distinct ',' +
                            QUOTENAME(COLUMN_NAME)
                          FROM INFORMATION_SCHEMA.COLUMNS
                          WHERE TABLE_NAME = 'new_table'
                          FOR XML PATH(''), TYPE
                         ).value('.', 'NVARCHAR(MAX)') 
                            , 1, 1, '');
    
    
    
    SET @query = 'INSERT INTO new_table ( '+ @NewTablecols + ' )
           SELECT ' + @NewTablecols + ' FROM YourTableName';
    
    execute(@query);
    

    这是假设在new_table 中找到的所有列列表都在第二个表YourTableName 中找到,否则,您将收到一条错误消息,指出未找到列名。

    在这里查看它的实际效果:

    【讨论】:

    • 我忘了指定这些表是基于不同的数据库的。由于这种情况,我应该考虑什么?
    • @JorgePM 对于INSERT 语句,使用DatabaseName.SchemaName.TableName 形式的完全限定表名,对于脚本集USE databasename; 来获取第一个表的列名。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    相关资源
    最近更新 更多