【问题标题】:Dynamic Table Insert TSQL: Insert records into another table where schemas are Mismatched动态表插入 TSQL:将记录插入另一个模式不匹配的表中
【发布时间】:2014-04-09 12:49:31
【问题描述】:

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

要求

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

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

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

【问题讨论】:

  • 请发表您的尝试
  • 如果目标有一个需要值的列,而源中没有匹配的列怎么办?什么定义了匹配列?

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


【解决方案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)

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多