怎样用 execl 表中的数据 覆盖mssql 数据 根据 某个相同字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样用 execl 表中的数据 覆盖mssql 数据 根据 某个相同字段相关的知识,希望对你有一定的参考价值。

例如 数据库中的 字段 AAA BBB CCC DDD execl中的行 AAA BBB CCC DDD跟据 数据库中的 AAA 等于 execl 中的 AAA 其中 数据库中的 BBB CCC DDD字段是空的 把 execl 中的 BBB CCC DDD 数据添入 MSSQL 数据库表中 大概就是这个样子了 当然 MSSQL 数据库中还有 其他字段 这些字段都保留 原数据 不知道我这样说够不够清楚

参考技术A 先把EXCEL表导入数据库,然后再 更新就是了。 参考技术B 好像能把EXECL数据导入到mssql。你可以删除掉,覆盖没做过

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

【中文标题】使用 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。我需要更新一下。提供的逻辑不起作用。

以上是关于怎样用 execl 表中的数据 覆盖mssql 数据 根据 某个相同字段的主要内容,如果未能解决你的问题,请参考以下文章

msSQL中怎样读取数组中的各元素!

怎样用SQL语句恢复SQLSERVER数据库备份,并覆盖现有(正在使用)数

python怎样抓取securecrt上的数据

mssql 的一张表中有100000条数据,如何用mssql语言将这100000条数据平均分到10张表中

sql数据库语句

navicat 导入execl数据 傻瓜式教程