没有触发器的魔术表使用,甚至在stackoverfloflow上也没有找到解释

时间:2017-07-20 10:26:44

标签: sql-server

1 个答案:

答案 0 :(得分:0)

以下是一些使用OUTPUT子句的几个例子,没有使用触发器...

USE AlignDev;
GO

IF OBJECT_ID('tempdb..#ChangeTracking', 'U') IS NULL 
BEGIN   -- DROP TABLE #ChangeTracking
    CREATE TABLE #ChangeTracking (
        ChangeDT DATETIME NOT NULL DEFAULT (GETDATE()),
        oID INT NULL,
        nID INT NULL,
        oCol_1 VARCHAR(10) NULL,
        nCol_1 VARCHAR(10) NULL,
        oCol_2 VARCHAR(10) NULL,
        nCol_2 VARCHAR(10) NULL,
        oCol_3 VARCHAR(10) NULL,
        nCol_3 VARCHAR(10) NULL
        );
END;


IF OBJECT_ID('tempdb..#TestData', 'U') IS NULL 
BEGIN   -- DROP TABLE #TestData
    CREATE TABLE #TestData (
        ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
        Col_1 VARCHAR(10) NULL,
        Col_2 VARCHAR(10) NULL,
        Col_3 VARCHAR(10) NULL
        );
END

--=================================================================

INSERT #TestData (Col_1, Col_2, Col_3) 
OUTPUT Inserted.* INTO #ChangeTracking (nID, nCol_1, nCol_2, nCol_3)
    SELECT 'abc', 'def', 'ghi' UNION ALL 
    SELECT 'jkl', 'mno', '123' UNION ALL 
    SELECT '346', '789', 'qaz' UNION ALL 
    SELECT 'wsx', 'edc', 'rfv' UNION ALL 
    SELECT 'tgb', 'yhn', 'ujm' UNION ALL 
    SELECT 'plm', 'uhb', 'tfc';

-- see what's been captured so far...
SELECT * FROM #TestData td;
SELECT * FROM #ChangeTracking ct;

------------------------------------------------

UPDATE td SET 
    td.Col_1 = 'xxx',
    td.Col_3 = 'zzz'
    OUTPUT Deleted.*, Inserted.*
    INTO #ChangeTracking (oID, oCol_1, oCol_2, oCol_3, nID, nCol_1, nCol_2, nCol_3)
FROM 
    #TestData td
WHERE 
    td.ID IN (2, 4, 6);

-- see what's been captured so far...
SELECT * FROM #TestData td;
SELECT * FROM #ChangeTracking ct;

------------------------------------------------

DELETE td
OUTPUT Deleted.* INTO #ChangeTracking ( oID, oCol_1, oCol_2, oCol_3)
FROM 
    #TestData td;

-- see what's been captured so far...
SELECT * FROM #TestData td;
SELECT * FROM #ChangeTracking ct;

HTH, 杰森