动态表插入TSQL:将记录插入另一个模式不匹配的表中

时间:2014-03-06 17:43:33

标签: sql sql-server tsql stored-procedures dynamic

为了有效地将记录从一个表移动到另一个表,我正在努力编写一个T-SQL存储过程以通用方式完成此任务。

  

要求

     
      
  1. 需要是通用的,以便特定列不会硬编码到存储过程中。
  2.   
  3. 唯一的输入参数应该是源表和目标表的名称。
  4.   
  5. 来自源的所有记录都已插入目的地
  6.   
  7. 对于给定记录,我们仅映射来自两个表的匹配列的数据
  8.   
  9. 源表中缺少的列将在目标表中收到其默认值。
  10.   
  11. 将忽略Destination表中缺少的任何列中的数据
  12.   

There is one stackoverflow question similar to this,但是他们试图根据某个日期时间的值插入到临时表中。我认为有必要将此作为原始问题发布,因为这将是一个完全通用的解决方案,没有附加特殊条件。

我知道解决方案将涉及使用Insert Into,非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

您可以将此作为存储过程的起点:

DECLARE @SourceSchema SYSNAME = 'dbo'   --Assume dbo for demo purposes.
DECLARE @SourceTable SYSNAME = 'SourceTableName'
DECLARE @DestSchema SYSNAME = 'dbo' --Assume dbo for demo purposes.
DECLARE @DestTable SYSNAME = 'DestinationTableName'

DECLARE @Tsql NVARCHAR(MAX) = ''
DECLARE @Columns NVARCHAR(MAX) = ''

SELECT @Columns = @Columns + '[' + src.COLUMN_NAME + '],'
FROM INFORMATION_SCHEMA.COLUMNS src
JOIN INFORMATION_SCHEMA.COLUMNS dest
    ON src.COLUMN_NAME = dest.COLUMN_NAME
    --Assume you only want to insert data from src fields to dest fields if they're the same data type.
    --Data conversion is messy and outside the scope of the OP's question.
    AND src.DATA_TYPE = dest.DATA_TYPE 
WHERE src.TABLE_SCHEMA = @SourceSchema
AND src.TABLE_NAME = @SourceTable
AND dest.TABLE_SCHEMA = @DestSchema
AND dest.TABLE_NAME = @DestTable

SET @Columns = LEFT(@Columns, LEN(@Columns) - 1)
PRINT @Columns

SET @Tsql = 'INSERT INTO [' + @DestSchema + '].[' + @DestTable + ']' +
    '(' + @Columns + ')' +
    'SELECT ' + @Columns +
    'FROM [' + @SourceSchema + '].[' + @SourceTable + ']'
PRINT @Tsql

--Uncomment when ready to proceed.
--EXEC (@TSql)