【问题标题】:How to insert row into a table by select column name and value from another table in SQL Server如何通过从 SQL Server 中的另一个表中选择列名和值将行插入到表中
【发布时间】:2017-02-07 09:14:35
【问题描述】:

我有一个包含许多列的表格,例如:

表 A

ColumnA | ColumnB | ColumnC | ColumnD | ColumnE
_______________________________________________
valueA  | valueB  | valueC  | valueD  | valueE

我怎样才能像下面这样插入到表 B 中?

表 B

ColumnName  | ColumnValue
_________________________
ColumnA     | valueA
ColumnB     | valueB
ColumnC     | valueC
ColumnD     | valueD
ColumnE     | valueE

谢谢!

【问题讨论】:

    标签: sql sql-server columnname


    【解决方案1】:

    您需要Unpivot 数据。一种选择使用CROSS APPLYtable valued constructor

    SELECT ColumnName,
           ColumnValue
    FROM   Yourtable
           CROSS APPLY (VALUES ('ColumnA',ColumnA),
                               ('ColumnB',ColumnB),
                               ('ColumnC',ColumnC),
                               ('ColumnD',ColumnD),
                               ('ColumnE',ColumnE))TC(ColumnName, ColumnValue) 
    

    【讨论】:

    • 使用 CROSS APPLY 会选择不必要的列,你知道其他方法让我只选择指定的列吗?非常感谢!
    • @Snow - 然后只在table valued constructor中添加那些列
    【解决方案2】:

    尝试使用动态 UNPIVOT:

    DECLARE @COLS VARCHAR(MAX) = ''
    SELECT @COLS = @COLS + ', [' + COLUMN_NAME + ']' FROM [yourDBName].INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'TableA'
    
    DECLARE @ColumNames VARCHAR(MAX)= STUFF(@COLS, 1,1, '')
    
    DECLARE @Cmd VARCHAR(MAX) = '
    SELECT * FROM
    (SELECT * FROM TableA) x
    UNPIVOT
    (
        [Value] FOR [Column] IN (' + @ColumNames + ')
    ) UNPVT'
    
    INSERT INTO TableB
    EXEC (@Cmd)
    

    【讨论】:

      【解决方案3】:

      使用UNPIVOT

      SELECT U.ColumnName,U.ColumnValue
      FROM @tblA A
      UNPIVOT
      (
        ColumnValue
        for ColumnName in ([ColumnA], [ColumnB], [ColumnC],[ColumnD],[ColumnE])
      ) U;
      

      【讨论】:

        【解决方案4】:

        您也可以为此使用普通的 UNPIVOT。

        使用表变量的示例:

        declare @TableA table (Id int identity(1,1), ColumnA int, ColumnB int, ColumnC int, ColumnD int, ColumnE int);
        declare @TableB table (ColumnName varchar(30), ColumnValue int);
        
        insert into @TableA (ColumnA, ColumnB, ColumnC, ColumnD, ColumnE) values 
        (1,2,3,4,5);
        
        insert into @TableB (ColumnName, ColumnValue)
        select ColumnName, ColumnValue from @TableA
        unpivot (ColumnValue for ColumnName in (ColumnA, ColumnB, ColumnC, ColumnD, ColumnE)) unpiv;
        
        select * from @TableB;
        

        返回:

        ColumnName  ColumnValue
        ----------  -----------
        ColumnA     1
        ColumnB     2
        ColumnC     3
        ColumnD     4
        ColumnE     5
        

        【讨论】:

          猜你喜欢
          • 2021-11-06
          • 1970-01-01
          • 2019-05-22
          • 2018-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-29
          相关资源
          最近更新 更多