Skip to content

Instantly share code, notes, and snippets.

@davghouse
Created February 11, 2017 01:09
Show Gist options
  • Save davghouse/13e57054334052b54b07578ae4f342e2 to your computer and use it in GitHub Desktop.
Save davghouse/13e57054334052b54b07578ae4f342e2 to your computer and use it in GitHub Desktop.
Copy Nation procedure for Unrooted World database
CREATE PROCEDURE [dbo].[CopyNation]
@id INT
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRAN;
DECLARE @NationIDPairs TABLE (
ExistingID INT NOT NULL UNIQUE,
InsertedID INT NOT NULL UNIQUE
);
DECLARE @ProvinceIDPairs TABLE (
ExistingID INT NOT NULL UNIQUE,
InsertedID INT NOT NULL UNIQUE
);
DECLARE @ResidentIDPairs TABLE (
ExistingID INT NOT NULL UNIQUE,
InsertedID INT NOT NULL UNIQUE
);
MERGE INTO [dbo].[Nations] AS Target
USING (
SELECT *
FROM [dbo].[Nations]
WHERE [ID] = @id
) AS Source
ON 1 = 0
WHEN NOT MATCHED BY TARGET THEN
INSERT (
[Name],
[FoundedDate])
VALUES (
Source.[Name],
Source.[FoundedDate])
OUTPUT Source.[ID], Inserted.[ID]
INTO @NationIDPairs;
MERGE INTO [dbo].[Provinces] AS Target
USING (
SELECT
copy.*,
j0.InsertedID j0InsertedID
FROM [dbo].[Provinces] copy
JOIN @NationIDPairs j0
ON copy.[NationID] = j0.ExistingID
) AS Source
ON 1 = 0
WHEN NOT MATCHED BY TARGET THEN
INSERT (
[NationID],
[Name],
[Motto],
[LeaderResidentID])
VALUES (
j0InsertedID,
Source.[Name],
Source.[Motto],
Source.[LeaderResidentID])
OUTPUT Source.[ID], Inserted.[ID]
INTO @ProvinceIDPairs;
MERGE INTO [dbo].[Residents] AS Target
USING (
SELECT
copy.*,
j0.InsertedID j0InsertedID,
j1.InsertedID j1InsertedID
FROM (
SELECT *
FROM [dbo].[Residents]
WHERE [ProvinceID] IN (SELECT ExistingID FROM @ProvinceIDPairs)
OR [NationalityNationID] IN (SELECT ExistingID FROM @NationIDPairs)
) AS copy
LEFT JOIN @ProvinceIDPairs j0
ON copy.[ProvinceID] = j0.ExistingID
LEFT JOIN @NationIDPairs j1
ON copy.[NationalityNationID] = j1.ExistingID
) AS Source
ON 1 = 0
WHEN NOT MATCHED BY TARGET THEN
INSERT (
[ProvinceID],
[NationalityNationID],
[Name],
[SpouseResidentID],
[FavoriteProvinceID])
VALUES (
COALESCE(j0InsertedID, [ProvinceID]),
COALESCE(j1InsertedID, [NationalityNationID]),
Source.[Name],
Source.[SpouseResidentID],
Source.[FavoriteProvinceID])
OUTPUT Source.[ID], Inserted.[ID]
INTO @ResidentIDPairs;
UPDATE copy
SET
copy.[LeaderResidentID] = j0.InsertedID
FROM [dbo].[Provinces] copy
JOIN @ResidentIDPairs j0
ON copy.[LeaderResidentID] = j0.ExistingID
WHERE copy.[ID] IN (SELECT InsertedID FROM @ProvinceIDPairs);
UPDATE copy
SET
copy.[SpouseResidentID] = COALESCE(j0.InsertedID, copy.[SpouseResidentID]),
copy.[FavoriteProvinceID] = COALESCE(j1.InsertedID, copy.[FavoriteProvinceID])
FROM [dbo].[Residents] copy
LEFT JOIN @ResidentIDPairs j0
ON copy.[SpouseResidentID] = j0.ExistingID
LEFT JOIN @ProvinceIDPairs j1
ON copy.[FavoriteProvinceID] = j1.ExistingID
WHERE copy.[ID] IN (SELECT InsertedID FROM @ResidentIDPairs);
COMMIT TRAN;
END;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment