Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL更新两个相同的表_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

SQL更新两个相同的表

SQL更新两个相同的表,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有两个相同的表,需要每天更新。两个表的结构完全相同。他们有100多列。那么,在SQL中是否有一种方法可以基于TableB更新TableA中的所有列,而无需为每一列编写(Set columnname='')update语句?这两个表都有相同的列名,所以我认为可能有更聪明的方法。可用的方法有UPDATE语句和MERGE语句。它们都要求在SET子句中更新指定的列名 如果需要,可以编写一个动态SQL来读取表的模式并生成一个包含所有列名的查询。这样您就不必手动编写所有列名。可用的方法有UPDATE语句和

我有两个相同的表,需要每天更新。两个表的结构完全相同。他们有100多列。那么,在SQL中是否有一种方法可以基于TableB更新TableA中的所有列,而无需为每一列编写(Set columnname='')update语句?这两个表都有相同的列名,所以我认为可能有更聪明的方法。可用的方法有
UPDATE
语句和
MERGE
语句。它们都要求在
SET
子句中更新指定的列名


如果需要,可以编写一个动态SQL来读取表的模式并生成一个包含所有列名的查询。这样您就不必手动编写所有列名。

可用的方法有
UPDATE
语句和
MERGE
语句。它们都要求在
SET
子句中更新指定的列名


如果需要,可以编写一个动态SQL来读取表的模式并生成一个包含所有列名的查询。这样,您就不必手动写入所有列名。

只需编写一次更新查询


然后从该查询创建一个存储过程。然后,只要在需要基于表b更新表a时执行存储过程即可。

只需编写一次更新查询


然后从该查询创建一个存储过程。然后,只要在需要基于表b更新表a时执行存储过程即可。

这有点老套,但可以做到。
我创建了两个相同的表,每个表有两条记录。(表1和表2)


表1

表2


SQL:


这有点老套,但可以做到。
我创建了两个相同的表,每个表有两条记录。(表1和表2)


表1

表2


SQL:


谢谢大家的评论。这是我决定用的最不专业的方式。首先在第二个表中找到列出的键,然后删除目标表中的这些行,并将它们从第二个表重新插入到目标表中。这样我就不必担心每列的update语句了。这是非常不专业,但它做的工作

谢谢大家的评论。这是我决定用的最不专业的方式。首先在第二个表中找到列出的键,然后删除目标表中的这些行,并将它们从第二个表重新插入到目标表中。这样我就不必担心每列的update语句了。这是非常不专业,但它做的工作

如果您不喜欢写所有列名,可以使用
sp\u help
获取所有列的列表。复制并粘贴到查询编辑器中,然后使用“查找”和“替换”建立查询。如果不喜欢写入所有列名,可以使用
sp\u help
获取所有列的列表。复制并粘贴到查询编辑器中,然后使用“查找和替换”建立查询。谢谢。在SQL中有没有一种方法可以找出包含更新信息的行?是的,如果使用“合并”,则有。检查MSDN,阅读关于OUTPUT子句和updated table。@user3314399-如果在数据更改后的某段时间内批量复制数据,可以将其放在源表上。这将允许您只处理自上次同步以来已更改的行。谢谢。在SQL中有没有一种方法可以找出包含更新信息的行?是的,如果使用“合并”,则有。检查MSDN,阅读关于OUTPUT子句和updated table。@user3314399-如果在数据更改后的某段时间内批量复制数据,可以将其放在源表上。这将允许您只处理自上次同步以来已更改的行。谢谢。如果两个表中都有复合主键,这将如何改变?谢谢。如果两个表中都有复合主键,那么这种情况会发生什么变化?
DECLARE @LeftTable VARCHAR(MAX) = 'Table_1';
DECLARE @RightTable VARCHAR(MAX) = 'Table_2';
DECLARE @UpdateStatement VARCHAR(MAX);
SELECT @UpdateStatement = COALESCE(@UpdateStatement + ', ', '') + 
                          't2.' + COLUMN_NAME + ' = t1.' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @LeftTable AND COLUMN_NAME <> 'ID'

SET @UpdateStatement = 'UPDATE t2 SET ' + @UpdateStatement + ' ' +
                       'FROM ' + @RightTable + ' t2 JOIN ' + @LeftTable + ' ' +
                       't1 ON t2.ID = t1.ID';
EXEC(@UpdateStatement)
-- The actual executed query is:
-- UPDATE t2 SET t2.Description = t1.Description,
--               t2.Extra = t1.Extra
-- FROM Table_2 t2 JOIN Table_1 t1 ON t2.ID = t1.ID
DECLARE @LeftTable VARCHAR(MAX) = 'Table_1';
DECLARE @RightTable VARCHAR(MAX) = 'Table_2';
DECLARE @UpdateStatement VARCHAR(MAX);
WITH ColumnNames AS
(
    SELECT c.name AS COLUMN_NAME from
    sys.tables t
    JOIN sys.columns c on t.object_id = c.object_id
    LEFT JOIN
    (
        SELECT ic.object_id
              ,ic.column_id
              ,idx.name AS index_name
        FROM sys.indexes idx
        JOIN sys.index_columns ic on idx.index_id = ic.index_id
        AND idx.object_id = ic.object_id AND idx.is_primary_key = 1
    ) idx ON t.object_id = idx.object_id AND c.column_id = idx.column_id
    WHERE t.name = @LeftTable
    AND idx.index_name IS NULL
)
SELECT @UpdateStatement = COALESCE(@UpdateStatement + ', ', '') + 
                          't2.' + COLUMN_NAME + ' = t1.' + COLUMN_NAME + CHAR(10)
FROM ColumnNames
SET @UpdateStatement = 'UPDATE t2 SET ' + @UpdateStatement + CHAR(10) +
                       'FROM ' + @RightTable + ' t2 JOIN ' + @LeftTable + CHAR(10) +
                       't1 ON t2.ID = t1.ID';
EXEC(@UpdateStatement)