我有一组FakeIds,然后在插入时转换为真实ID。我现在想要获得伪造到真实的映射。我的查询就像
INSERT INTO Data_tbl
(days)
OUTPUT inserted.DateID, 0,source.DateID into @mappedIDs(objectId, objectTypeId, fakeId)
SELECT Days
FROM @inputTable
我知道Source.DateId不起作用,但我已经把它放在那里解释我需要的东西
答案 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]