Sql 如何将带有插入输出的源columnvalue插入到新表中?

Sql 如何将带有插入输出的源columnvalue插入到新表中?,sql,sql-server,Sql,Sql Server,我有一组伪造的ID,插入时会转换成真实的ID。我现在想获得假到真的映射。我的问题是 INSERT INTO Data_tbl (days) OUTPUT inserted.DateID, 0,source.DateID into @mappedIDs(objectId, objectTypeId, fakeId) SELECT Days FROM @inputTable 我知道Source.DateId不起作用,但我把它放在那里是为

我有一组伪造的ID,插入时会转换成真实的ID。我现在想获得假到真的映射。我的问题是

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

我知道Source.DateId不起作用,但我把它放在那里是为了解释我需要什么

当您不将两个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')
这是insert语句。注意,在这个例子中我只插入了天数,但是如果需要,您可以插入更多。如果您试图构建地图,那么输出子句there是保持不变的重要内容。您必须收集在目的地表中创建的日期ID和日期

INSERT INTO #Data_tbl
([Days])
OUTPUT inserted.DateID, inserted.[Days] into @mappedIDs(InsertedID, [Days]) 
SELECT  Days                            
FROM @inputTable source
现在,让我们展示地图!我将插入的行(在@mappedIDs中)加入到我的源记录中。现在我可以看到从FakeID到“real”ID的映射


当您没有将两个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')
这是insert语句。注意,在这个例子中我只插入了天数,但是如果需要,您可以插入更多。如果您试图构建地图,那么输出子句there是保持不变的重要内容。您必须收集在目的地表中创建的日期ID和日期

INSERT INTO #Data_tbl
([Days])
OUTPUT inserted.DateID, inserted.[Days] into @mappedIDs(InsertedID, [Days]) 
SELECT  Days                            
FROM @inputTable source
现在,让我们展示地图!我将插入的行(在@mappedIDs中)加入到我的源记录中。现在我可以看到从FakeID到“real”ID的映射


请改用合并命令。。。在OUTPUT子句中,您可以提到所需的inserted和source列

下面给出了示例代码

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

请改用合并命令。。。在OUTPUT子句中,您可以提到所需的inserted和source列

下面给出了示例代码

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

如何将ID从假转换为真?天数是否唯一?如果是这样的话,可以在插入后将其用于连接源和目标以确定映射。一旦插入,我将使用伪唯一ID(如-1、-2-3等)发送数据,我需要将这些映射到在identity列中插入时生成的实际ID,以便进一步使用processing@DanGuzman不,它不是唯一的。ID是如何从假转换为真的?天是唯一的吗?如果是这样的话,可以在插入后将其用于连接源和目标以确定映射。我将使用伪唯一ID(如-1、-2-3等)发送数据,一旦它们被插入,我需要将它们映射到标识列中插入时生成的实际ID,以便在以后的操作中使用processing@DanGuzman不,它不是独一无二的