If the restrictions I mentioned don't apply, the following extension of Adam's code illustrates a single-step alternative:
Setup:
USE tempdb;
GO
CREATE TABLE dbo.MasterRecord
(
master_id INTEGER IDENTITY PRIMARY KEY,
col CHAR(1) NOT NULL,
);
CREATE TABLE dbo.DetailRecord
(
detail_id INTEGER IDENTITY NOT NULL,
master_id INTEGER NOT NULL,
col_desc VARCHAR(50) NOT NULL,
);
CREATE TABLE dbo.SomeOtherTable
(
col CHAR(1) NOT NULL,
data VARCHAR(50) NOT NULL,
);
INSERT dbo.SomeOtherTable
(col, data)
VALUES ('a','This is a better description');
Single step solution:
INSERT dbo.DetailRecord
(master_id, col_desc)
SELECT INS.master_id, INS.data
FROM (
MERGE dbo.MasterRecord MR
USING (
SELECT SOT.col, SOT.data
FROM (VALUES ('a')) New (data)
JOIN dbo.SomeOtherTable SOT
ON SOT.col = New.data
) MS
ON (MS.col = MR.col)
WHEN NOT MATCHED BY TARGET
THEN INSERT (col) VALUES (MS.col)
OUTPUT INSERTED.master_id, INSERTED.col, MS.data
) INS;
Results and cleanup:
SELECT * FROM dbo.MasterRecord
SELECT * FROM dbo.DetailRecord
-- Cleanup
DROP TABLE dbo.DetailRecord;
DROP TABLE dbo.MasterRecord;
DROP TABLE dbo.SomeOtherTable;
Paul White
SQLPerformance.com
SQLkiwi blog
@SQL_Kiwi