मैं वास्तव में MERGE
से परिचित नहीं हूं इसलिए मैं दो INSERT
. का उपयोग करके एक वैकल्पिक समाधान का प्रस्ताव कर रहा हूं बयान:
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO table1(col1, col2)
SELECT DISTINCT col1, col2 FROM tbl
INSERT INTO table2(col3, table1fk)
SELECT
t.col3,
t1.Id
FROM tbl t
INNER JOIN table1 t1
ON t1.col1 = t.col1
AND t1.col2 = t.col2
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0) BEGIN
ROLLBACK TRANSACTION
END
DECLARE
@ErrorNumber INT,
@ErrorMessage NVARCHAR(4000),
@ErrorState INT,
@ErrorSeverity INT,
@ErrorLine INT
SELECT
@ErrorNumber = ERROR_NUMBER(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorLine = ERROR_LINE(),
@ErrorMessage = ERROR_MESSAGE()
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
PRINT 'Error detected, transaction rolled back.'
END CATCH
पहला, INSERT
col1,col2
. की अनूठी पंक्तियां table1
. में ।
दूसरा वाला, एक JOIN
करता है tbl
. पर और table1
FK को table1
. से प्राप्त करने के लिए ।
ये दो INSERT
विवरण केवल एक लेन-देन के अंतर्गत होने चाहिए।