2014-03-06 39 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) 
相關問題