在两个表之间复制一行,忽略缺少的列

时间:2015-12-03 14:16:15

标签: sql tsql stored-procedures

我正在创建一个存储过程,我正在寻找一种方法将一行从一个表复制到另一个表,这两个表有一个非常相似的结构,唯一的区别是第二个表有一些缺少的列

例如:

Table1
A | B | C | D

Table2
A | C | D

有一种方法可以在这两个表之间进行复制而无需编写存储过程中的每个字段吗? (显然忽略了缺失的列)

2 个答案:

答案 0 :(得分:1)

这是一种动态SQL方法,因为您提到在更改时不提前知道表列。希望数据类型匹配:)

DECLARE @Table1 VARCHAR(500) = 'TableA', @Table2 VARCHAR(500) = 'TableB'
DECLARE @Columns VARCHAR(MAX) = SUBSTRING((
    SELECT
        ',[' + C1.COLUMN_NAME + ']' AS [text()]
    FROM INFORMATION_SCHEMA.COLUMNS C1
        INNER JOIN INFORMATION_SCHEMA.COLUMNS C2
            ON C1.COLUMN_NAME = C2.COLUMN_NAME
    WHERE C1.TABLE_NAME = @Table1
        AND C2.TABLE_NAME = @Table2
    FOR XML PATH ('')
    ), 2, 4000)
DECLARE @Sql NVARCHAR(MAX) = 'INSERT [' + @Table1 + '] (' + @Columns + ') '
    + 'SELECT ' + @Columns + ' FROM [' + @Table2 + ']'
--EXEC sys.sp_executesql @Sql
PRINT @Sql

答案 1 :(得分:0)

不是没有动态SQL(对于这个问题会有很大的过度杀伤力),但无论如何你都不想这样做。

没有指定列列表的查询本身就很脆弱。基础表中的第二个更改,您的查询可能会中断。可能是默默地,以一种方式写入数据而不是你期望它保存的数据。

所以

  1. 手写出来。它是更安全,更耐用的代码,对灵魂有益; - )
  2. 如果您真的无法获取列列表并且它们非常庞大,请从INFORMATION_SCHEMA.COLUMNS获取列表。复制,粘贴,添加一些逗号,你就可以完成很少的输入。