为了有效地将记录从一个表移动到另一个表,我正在努力编写一个T-SQL存储过程以通用方式完成此任务。
要求:
- 需要是通用的,以便特定列不会硬编码到存储过程中。
- 唯一的输入参数应该是源表和目标表的名称。
- 来自源的所有记录都已插入目的地
- 对于给定记录,我们仅映射来自两个表的匹配列的数据
- 源表中缺少的列将在目标表中收到其默认值。
- 将忽略Destination表中缺少的任何列中的数据
醇>
There is one stackoverflow question similar to this,但是他们试图根据某个日期时间的值插入到临时表中。我认为有必要将此作为原始问题发布,因为这将是一个完全通用的解决方案,没有附加特殊条件。
我知道解决方案将涉及使用Insert Into,非常感谢任何帮助。谢谢。
答案 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)