我寫一個數據泵,但未通過source_table
與oz4
列code
,some_data
,oz1
,oz2
,oz3
,信息,我這樣做是與相同的結構存儲target_table
。同時,我想更新也具有不同的結構(比如oz_table
)另一個表 - 記錄code
,oz
- 這是四個記錄,而不是一個記錄有四個值(最大,因爲空和NULL值對於ozX
不被存儲)。如何使用MERGE,然後將一個源記錄拆分爲更多的目標記錄?
我正在使用MERGE
命令(Microsoft T-SQL)作爲現有的target_table
(一個記錄中的四盎司 - 舊方法)。使用OUTPUT
機制將INSERT/UPDATE記錄收集到表變量@info_table
中。 (如果源記錄消失的目標記錄被故意永遠不會被刪除,所以,不存在DELETE操作)
到目前爲止,我有這樣的代碼:
CREATE PROCEDURE dbo.data_pump
AS
BEGIN
SET NOCOUNT ON
DECLARE @result int = -555 -- init (number of affected records)
DECLARE @info_table TABLE (
action nvarchar(10),
code int,
oz1 nvarchar(40),
oz2 nvarchar(40),
oz3 nvarchar(40),
oz4 nvarchar(40)
)
BEGIN TRANSACTION tran_data_pump
BEGIN TRY
MERGE target_table AS target
USING (SELECT code, some_data, oz1, oz2, oz3, oz4
FROM source_table) AS source
ON target.code = source.code
WHEN MATCHED AND (COALESCE(target.some_data, '') != COALESCE(source.some_data, '')
OR COALESCE(target.oz1, '') != COALESCE(source.oz1, '')
OR COALESCE(target.oz2, '') != COALESCE(source.oz2, '')
OR COALESCE(target.oz3, '') != COALESCE(source.oz3, '')
OR COALESCE(target.oz4, '') != COALESCE(source.oz4, '')
) THEN
UPDATE
SET target.some_data = source.some_data,
target.oz1 = source.oz1,
target.oz2 = source.oz2,
target.oz3 = source.oz3,
target.oz4 = source.oz4
WHEN NOT MATCHED THEN
INSERT (code, some_data,
oz1, oz2, oz3, oz4)
VALUES (source.code, source.some_data,
source.oz1, source.oz2, source.oz3, source.oz4)
OUTPUT
$action AS action, -- INSERT or UPDATE
inserted.code AS code,
inserted.oz1 AS oz1,
inserted.oz2 AS oz2,
inserted.oz3 AS oz3,
inserted.oz4 AS oz4
INTO @info_table;
SET @result = @@ROWCOUNT
COMMIT TRANSACTION tran_data_pump
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION tran_data_pump
SET @result = -1 -- transaction-failed indication
END CATCH
RETURN @result -- OK, number of the transfered records
END
它工作正常,到目前爲止, 。現在我想處理@info_table
來插入/更新oz_table
。對於動作UPDATE
,應先刪除帶有code
的記錄,並插入新記錄。順序不重要,插入記錄的新數可能不同。 NULL
或以盎司爲單位的空串不應產生任何記錄。對於INSERT
操作,插入新記錄的情況更簡單。
更新:該問題稍作修改以澄清問題的核心。數據表可以這樣定義:?
CREATE TABLE dbo.source_table (
ID int IDENTITY PRIMARY KEY NOT NULL,
code int,
some_data nvarchar(50),
oz1 nvarchar(40),
oz2 nvarchar(40),
oz3 nvarchar(40),
oz4 nvarchar(40)
)
CREATE TABLE dbo.target_table (
ID int IDENTITY PRIMARY KEY NOT NULL,
code int,
some_data nvarchar(50),
oz2 nvarchar(40),
oz3 nvarchar(40),
oz1 nvarchar(40),
oz4 nvarchar(40)
)
CREATE TABLE dbo.oz_table (
ID int IDENTITY PRIMARY KEY NOT NULL,
code int,
oz nvarchar(40) NOT NULL
)
看到完整的測試腳本(創建數據庫,表,調用data_pump
在http://pastebin.com/wBz3Tzwn
如何很好地做到這一點,我需要的高效解決方案日期的量可能大,而且操作要儘可能快
你說_Now我想處理'@ info_table'插入/更新'alternative_table'_,是它除了'source_table','target_table','@ info_table'第四屆表?這似乎是另一個MERGE操作。順便說一句,如果你能提供一個輸入/輸出的例子,那理解起來會更好。 –
你能提供另一個表的結構嗎? –
@MincongHuang:是的。查看更新的問題。您還可以找到完整代碼片段的鏈接,包括測試數據。只有在代碼片段的oz_table定義中用'code'替換'sourceID'(我的錯誤)。沒有輸出示例,但它應該是具有「代碼」的未轉義輸入(如果插入或修改了源記錄)。 – pepr