2014-03-06 37 views
0

为了有效地将记录从一个表移动到另一个表,我努力编写T-SQL存储过程以通用方式完成此任务。动态表插入TSQL:将记录插入到模式不匹配的另一个表中

要求

  1. 需要是通用的,因此,具体的列没有硬编码到存储过程。
  2. 唯一的输入参数应该是源表和目标表的名称。
  3. 从源代码全部记录插入到目标
  4. 对于一个给定的记录,我们绘制了只有两个表
  5. 列从源表中缺少将获得目标表的默认值从匹配列中的数据。
  6. 从目标表中缺少任何列中的数据将完全忽略

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

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

+0

请发表您尝试 – Jayvee

+0

如果有什么目的有需要的值,并且没有匹配的列在源列?什么定义匹配列? – Paparazzi

回答

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) 
相关问题