CREATE OR ALTER PROCEDURE dbo.USP_UpdateBrewery( @BreweryPostID UNIQUEIDENTIFIER, @BreweryName NVARCHAR(256), @Description NVARCHAR(512), @BreweryPostLocationID UNIQUEIDENTIFIER = NULL, @CityID UNIQUEIDENTIFIER = NULL, @AddressLine1 NVARCHAR(256) = NULL, @AddressLine2 NVARCHAR(256) = NULL, @PostalCode NVARCHAR(20) = NULL, @Coordinates GEOGRAPHY = NULL ) AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; IF @BreweryName IS NULL THROW 50001, 'Brewery name cannot be null.', 1; IF @Description IS NULL THROW 50002, 'Brewery description cannot be null.', 1; IF NOT EXISTS (SELECT 1 FROM dbo.BreweryPost WHERE BreweryPostID = @BreweryPostID) THROW 50404, 'Brewery not found.', 1; IF @CityID IS NOT NULL AND NOT EXISTS (SELECT 1 FROM dbo.City WHERE CityID = @CityID) THROW 50404, 'City not found.', 1; BEGIN TRANSACTION; UPDATE dbo.BreweryPost SET BreweryName = @BreweryName, Description = @Description, UpdatedAt = GETDATE() WHERE BreweryPostID = @BreweryPostID; IF @CityID IS NULL BEGIN -- No location supplied: clear any existing location for this brewery. DELETE FROM dbo.BreweryPostLocation WHERE BreweryPostID = @BreweryPostID; END ELSE IF EXISTS (SELECT 1 FROM dbo.BreweryPostLocation WHERE BreweryPostID = @BreweryPostID) BEGIN UPDATE dbo.BreweryPostLocation SET CityID = @CityID, AddressLine1 = @AddressLine1, AddressLine2 = @AddressLine2, PostalCode = @PostalCode, Coordinates = @Coordinates WHERE BreweryPostID = @BreweryPostID; END ELSE BEGIN INSERT INTO dbo.BreweryPostLocation (BreweryPostLocationID, BreweryPostID, CityID, AddressLine1, AddressLine2, PostalCode, Coordinates) VALUES (ISNULL(@BreweryPostLocationID, NEWID()), @BreweryPostID, @CityID, @AddressLine1, @AddressLine2, @PostalCode, @Coordinates); END COMMIT TRANSACTION; END