使用 MSSQL 中的 DYNAMIC SQL 从另一个表更新一个表中的值

Posted

技术标签:

【中文标题】使用 MSSQL 中的 DYNAMIC SQL 从另一个表更新一个表中的值【英文标题】:updating values in one table from another table using DYNAMIC SQL in MSSQL 【发布时间】:2014-07-05 11:46:07 【问题描述】:

我有一个临时表 A,它有 2 列 col1:ID col2:使用 XML 生成的值。我需要用 col2 中存在的值更新表 B 中与表 A 的 column1:ID 对应的列:表 A 的值。注意:只有特定列而不是表 B 中的所有列需要更新

表A

+----+-------+
| ID | Value |
+----+-------+
|  1 |   533 |
|  5 |    34 |
|  6 |    56 |
+----+-------+

表 B

+-----+---+---+---+----+----+---+
|  1  | 2 | 3 | 4 | 5  | 6  | 7 |
+-----+---+---+---+----+----+---+
| 533 |   |   |   | 34 | 56 |   |
+-----+---+---+---+----+----+---+

 declare dynsql varchar(4000) = ' update table B set....... '

【问题讨论】:

为什么需要动态sql?表B也只包含一行吗?如果不是,你怎么知道要更新哪一行? 与@Martin Smith 所说的类似,表A 是否仅包含一组值?如果不是,你怎么知道表 A 的哪一组值更新了表 B 的[哪一行]? Martin,表 B 将始终包含一行,大约 140 列,其中只有名称与表 A 中的 ID 匹配的列需要更新。 @AndriyM ,表A的列ID与表B的列名匹配。 A.ID 中没有重复项,对吗?您可能希望将这些信息添加到您的主要帖子中,以使遇到问题的每个人都更清楚地了解问题。 【参考方案1】:

尝试以下查询:

UPDATE TableB
SET [1] = ISNULL(z.[1],TableB.[1]),
    [2] = ISNULL(z.[2],TableB.[2]),
    [3] = ISNULL(z.[3],TableB.[3]),
    [4] = ISNULL(z.[4],TableB.[4]),
    [5] = ISNULL(z.[5],TableB.[5]),
    [6] = ISNULL(z.[6],TableB.[6]),
    [7] = ISNULL(z.[7],TableB.[7])
FROM (
    SELECT [1],[2],[3],[4],[5],[6],[7] 
    FROM (SELECT Id, Value
          FROM TableA)AS p
    PIVOT (MAX(Value) FOR Id IN([1],[2],[3],[4],[5],[6],[7]))AS pvt
    )z

编辑

为了获得动态数据透视,请使用以下查询:

DECLARE @columns1 NVARCHAR(1000) = '',
        @columns2 NVARCHAR(1000) = '',
        @sql NVARCHAR(MAX)

SELECT @Columns1 = STUFF((SELECT ',['+Value+'] = ISNULL(z.['+Value+'],TableB.['+Value+'])'
                        FROM (SELECT DISTINCT Value FROM TableA)z
                        FOR XML PATH('')),1,1,''),
        @Columns2 = STUFF((SELECT ',['+Value+']'
                        FROM (SELECT DISTINCT Value FROM TableA)z
                        FOR XML PATH('')),1,1,'')


SET @sql = 'Update TableB
            Set '+@columns1+' 
            From ( 
                  Select '+ @columns2+'
                  From (Select Id, Value From TableA) AS p
                  Pivot (MAX(Value) For Id IN ('+@columns2+')) AS Pvt
            )z'

EXECUTE(@sql)

【讨论】:

感谢@mehdi,但是使用这种方法,您将值设置为 NULL。除此之外,我需要在运行时匹配列名而不是硬编码。 我编辑我的帖子。如果您想使用动态数据透视表,请查看我的编辑。【参考方案2】:
INSERT INTO tb  
SELECT [1],[2],[3],[4],[5],[6],[7] FROM
(SELECT 
id,value
  from ta)as p
PIVOT
(AVG(value) FOR id IN([1],[2],[3],[4],[5],[6],[7])
 )as bah

Fiddle

【讨论】:

谢谢@Mihai。我需要更新一下。提供的逻辑不起作用。

以上是关于使用 MSSQL 中的 DYNAMIC SQL 从另一个表更新一个表中的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL Server 2012 中的 MSSQL_Query 的 PHP 调用存储过程返回无效值

是否可以从 MySQL 和 MSSQL 同步两个链接服务器中的两个表?

仅将表数据从 MSSQL 迁移到 MySQL

如何从 T-SQL 中的表中选择前 N 行?

将数据从 SQL Server 复制到 Mysql

nodejs mssql中的SQL Server连接超时错误