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