如何将插入输出的源列值插入到新表中?

时间:2016-09-02 12:06:46

标签: sql sql-server

我有一组FakeIds,然后在插入时转换为真实ID。我现在想要获得伪造到真实的映射。我的查询就像

INSERT INTO Data_tbl
(days)
OUTPUT inserted.DateID, 0,source.DateID into @mappedIDs(objectId, objectTypeId, fakeId) 
SELECT  Days                            
FROM @inputTable 

我知道Source.DateId不起作用,但我已经把它放在那里解释我需要的东西

2 个答案:

答案 0 :(得分:2)

使用 MERGE 命令代替...在OUTPUT子句中,您可以提及所需的插入列和源列。

示例代码如下。

MERGE Data_tbl d
USING   (   SELECT  DateID,Days
             FROM @inputTable

        ) d1 ON  d.DateID = d1.DateID
WHEN NOT MATCHED 
THEN INSERT 
    ([days])
    VALUES (d1.[days])
OUTPUT  inserted.DateID, 0,d1.DateID INTO @mappedID

答案 1 :(得分:0)

当您不将两个ID传递到目标表时,将插入数据映射到源数据的技巧很棘手,您必须构建自己的映射。这是我可以用来构建自己的完整脚本。

首先,为了模拟你的目标表我创建了一个临时表,所以我总是检查临时表是否已经存在,以防我想多次运行该演示。

IF OBJECT_ID('tempdb..#Data_tbl') IS NOT NULL
    DROP TABLE #Data_tbl

然后我只用我需要的两列创建目标表的版本。

CREATE TABLE #Data_tbl (
      DateID INT IDENTITY(1,1)
    , [Days] DATE 
)

然后我像你一样创建我的表变量,但是我改变了列名,希望使事情变得不那么复杂。在我的输出中,我只捕获创建的ID和插入的日期。插入的日期非常重要,因为这将是我稍后在加入时使用的密钥。

DECLARE @mappedIDs TABLE (
      InsertedID INT
    , [Days] DATE
)

然后我设置一个表格来表示我要插入的行。这样,您可以测试在批处理中插入多行时会发生什么!

DECLARE @inputTable TABLE (
    FakeID INT
    , [Days] DATE
)

现在,让我们排成一行。

INSERT INTO @inputTable
VALUES (1, '9/2/2016')

这里是插入语句。请注意,我只插入此示例中的日期,但如果需要,您可以插入更多日期。如果您正在尝试构建地图,那么输出子句就必须保持相同。您必须收集目标表中创建的DateID和Days。

INSERT INTO #Data_tbl
([Days])
OUTPUT inserted.DateID, inserted.[Days] into @mappedIDs(InsertedID, [Days]) 
SELECT  Days                            
FROM @inputTable source

现在,让我们来看看地图吧!我获取插入的行(在@mappedIDs中)并将其连接到Days上的源记录。现在我可以看到从FakeID到"真实" ID。

SELECT 
    results.InsertedID, src.FakeID, src.[Days]
FROM @mappedIDs results
INNER JOIN @inputTable src
    ON results.[Days] = src.[Days]