SQL Server:从插入选择返回联接的数据

时间:2018-07-06 12:46:07

标签: sql sql-server

我执行步骤:

  1. 创建时态表,并用数据和唯一顺序列[_oid]
  2. 填充它
  3. 将时间表插入虚表[_oid]之外的所有内容,输出生成的[id]
  4. 返回生成的[id]和相应的[_oid]

SQL:

CREATE TABLE #temp
(
    [Hash] INT NOT NULL,
    [Size] INT NOT NULL,
    [Data] NVARCHAR(MAX),
    [_oid] INT NOT NULL
)

--here insert data into #temp--
INSERT [dbo].[TestObjects]
OUTPUT INSERTED.[Id]
    SELECT [Hash], [Size], [Data] 
    FROM #temp

DROP TABLE #temp

如何返回([Id], [_oid])行? ....或者至少返回[Id]排序的[_oid]吗?

我知道insert不会在其输出中保留插入项目的顺序,但仍然...

3 个答案:

答案 0 :(得分:1)

我认为您需要的是INSERT INTO,就像这样:

INSERT INTO [dbo].[TestObjects]
SELECT Hash, Size, Data FROM #temp
ORDER BY _oid

但是正如您所说,不能保证从TestObjects中进行选择时的顺序,因此,如果重要的话,您是否可以在TestObjects中没有字段,可以在从中进行选择时进行ORDER BY?

答案 1 :(得分:1)

如果您插入#temp的o_id和(hash,size,data)对于每一行(即键)都是唯一的,则可以从#temp中检索插入的o_id:

select t.[_oid],to.[Id]
from #temp t
inner join [dbo].[TestObjects] to 
on t.Hash=to.Hash and t.Size=to.Size and  t.data=to.data

答案 2 :(得分:1)

正如George Menoutis所说,我确实合并了:

MERGE [dbo].[TestObjects] AS T_Base
USING #temp AS T_Source
ON (0<>0)
WHEN NOT MATCHED THEN INSERT ([Hash],[Size],[Data]) VALUES (T_Source.[Hash],T_Source.[Size],T_Source.[Data])
OUTPUT INSERTED.[Id], T_Source.[_oid];

如果有人有更好的方法,请随时为这个答案做贡献。