ProGet SQL diff
104 lines
USE [ProGet]
USE [ProGet]
GO
GO
/****** Object: StoredProcedure [dbo].[PackageNameIds_GetOrCreatePackageNameId] Script Date: 16-Oct-2025 5:21:31 PM ******/
/****** Object: StoredProcedure [dbo].[PackageNameIds_GetOrCreatePackageNameId] Script Date: 16-Oct-2025 5:21:31 PM ******/
SET ANSI_NULLS ON
SET ANSI_NULLS ON
GO
GO
SET QUOTED_IDENTIFIER ON
SET QUOTED_IDENTIFIER ON
GO
GO
ALTER PROCEDURE [dbo].[PackageNameIds_GetOrCreatePackageNameId]
ALTER PROCEDURE [dbo].[PackageNameIds_GetOrCreatePackageNameId]
(
(
@PackageType_Name VARCHAR(20),
@PackageType_Name VARCHAR(20),
@PackageGroup_Name VARCHAR(200),
@PackageGroup_Name VARCHAR(200),
@Package_Name VARCHAR(200),
@Package_Name VARCHAR(200),
@CreateId_Indicator YNINDICATOR = 'Y',
@CreateId_Indicator YNINDICATOR = 'Y',
@PackageName_Id INT = NULL OUT
@PackageName_Id INT = NULL OUT
)
)
AS
AS
BEGIN
BEGIN
SET NOCOUNT ON
SET NOCOUNT ON
-- Currently only rpm has case senstive mapping.
-- Currently only rpm has case senstive mapping.
-- Convert to function if another is added.
-- Convert to function if another is added.
IF @PackageType_Name IN ('rpm')
IF @PackageType_Name IN ('rpm')
SELECT @PackageName_Id = [PackageName_Id]
SELECT @PackageName_Id = [PackageName_Id]
FROM [PackageNameIds]
FROM [PackageNameIds]
WHERE [PackageType_Name] = @PackageType_Name
WHERE [PackageType_Name] = @PackageType_Name
AND (([PackageGroup_Name] IS NULL AND @PackageGroup_Name IS NULL) OR ([PackageGroup_Name] = @PackageGroup_Name))
AND (([PackageGroup_Name] IS NULL AND @PackageGroup_Name IS NULL) OR ([PackageGroup_Name] = @PackageGroup_Name))
AND [Package_Name] = @Package_Name
AND [Package_Name] = @Package_Name
ELSE BEGIN
ELSE BEGIN
DECLARE @Actual_PackageGroup_Name VARCHAR(200)
DECLARE @Actual_PackageGroup_Name VARCHAR(200)
DECLARE @Actual_Package_Name VARCHAR(200)
DECLARE @Actual_Package_Name VARCHAR(200)
-- prefer an exact case match if there are multiple entries
-- prefer an exact case match if there are multiple entries
SELECT @PackageName_Id = [PackageName_Id],
SELECT TOP (1)
@Actual_PackageGroup_Name = [PackageGroup_Name],
@PackageName_Id = p.[PackageName_Id],
@Actual_Package_Name = [Package_Name]
@Actual_PackageGroup_Name = p.[PackageGroup_Name],
FROM [PackageNameIds]
@Actual_Package_Name = p.[Package_Name]
WHERE [PackageType_Name] = @PackageType_Name
FROM dbo.[PackageNameIds] AS p
AND (([PackageGroup_Name_Lower] IS NULL AND @PackageGroup_Name IS NULL) OR ([PackageGroup_Name_Lower] = LOWER(@PackageGroup_Name)))
WHERE
AND [Package_Name_Lower] = LOWER(@Package_Name)
p.[PackageType_Name] = @PackageType_Name
ORDER BY CASE WHEN [Package_Name] = @Actual_Package_Name AND (([PackageGroup_Name] IS NULL AND @PackageGroup_Name IS NULL) OR [PackageGroup_Name] = @PackageGroup_Name) THEN 0 ELSE 1 END, [PackageName_Id] DESC
AND (
(p.[PackageGroup_Name_Lower] IS NULL AND @PackageGroup_Name IS NULL)
OR p.[PackageGroup_Name_Lower] = LOWER(@PackageGroup_Name)
)
AND p.[Package_Name_Lower] = LOWER(@Package_Name)
ORDER BY
-- 1) Exact case-sensitive match on both name & group wins
CASE WHEN
p.[Package_Name] = @Package_Name COLLATE Latin1_General_CS_AS
AND (
(p.[PackageGroup_Name] IS NULL AND @PackageGroup_Name IS NULL)
OR p.[PackageGroup_Name] = @PackageGroup_Name COLLATE Latin1_General_CS_AS
)
THEN 0 ELSE 1 END,
-- 2) If ties, prefer exact case on name
CASE WHEN p.[Package_Name] = @Package_Name COLLATE Latin1_General_CS_AS
THEN 0 ELSE 1 END,
-- 3) Then prefer exact case on group (with proper NULL semantics)
CASE WHEN
(p.[PackageGroup_Name] IS NULL AND @PackageGroup_Name IS NULL)
OR p.[PackageGroup_Name] = @PackageGroup_Name COLLATE Latin1_General_CS_AS
THEN 0 ELSE 1 END,
-- 4) Stable fallback (oldest record)
p.[PackageName_Id] ASC;
-- if the cases don't match and we are adding a package, update the row to the newer one
-- if the cases don't match and we are adding a package, update the row to the newer one
IF @CreateId_Indicator = 'Y' AND @PackageName_Id IS NOT NULL
IF @CreateId_Indicator = 'Y' AND @PackageName_Id IS NOT NULL
AND (@Package_Name <> @Actual_Package_Name COLLATE Latin1_General_CS_AS
AND (@Package_Name <> @Actual_Package_Name COLLATE Latin1_General_CS_AS
OR (@PackageGroup_Name IS NOT NULL AND @PackageGroup_Name <> @Actual_PackageGroup_Name COLLATE Latin1_General_CS_AS))
OR (@PackageGroup_Name IS NOT NULL AND @PackageGroup_Name <> @Actual_PackageGroup_Name COLLATE Latin1_General_CS_AS))
BEGIN
BEGIN
UPDATE [PackageNameIds]
UPDATE [PackageNameIds]
SET [PackageGroup_Name] = @PackageGroup_Name,
SET [PackageGroup_Name] = @PackageGroup_Name,
[Package_Name] = @Package_Name
[Package_Name] = @Package_Name
WHERE [PackageName_Id] = @PackageName_Id
WHERE [PackageName_Id] = @PackageName_Id
END
END
END
END
IF @CreateId_Indicator = 'N' OR @PackageName_Id IS NOT NULL
IF @CreateId_Indicator = 'N' OR @PackageName_Id IS NOT NULL
RETURN
RETURN
BEGIN TRY
BEGIN TRY
INSERT INTO [PackageNameIds]
INSERT INTO [PackageNameIds]
(
(
[PackageType_Name],
[PackageType_Name],
[PackageGroup_Name],
[PackageGroup_Name],
[Package_Name]
[Package_Name]
)
)
VALUES
VALUES
(
(
@PackageType_Name,
@PackageType_Name,
@PackageGroup_Name,
@PackageGroup_Name,
@Package_Name
@Package_Name
)
)
SET @PackageName_Id = SCOPE_IDENTITY()
SET @PackageName_Id = SCOPE_IDENTITY()
END TRY BEGIN CATCH
END TRY BEGIN CATCH
-- Currently only rpm has case senstive mapping.
-- Currently only rpm has case senstive mapping.
-- Convert to function if another is added.
-- Convert to function if another is added.
IF @PackageType_Name IN ('rpm')
IF @PackageType_Name IN ('rpm')
SELECT @PackageName_Id = [PackageName_Id]
SELECT @PackageName_Id = [PackageName_Id]
FROM [PackageNameIds] WITH (NOLOCK)
FROM [PackageNameIds] WITH (NOLOCK)
WHERE [PackageType_Name] = @PackageType_Name
WHERE [PackageType_Name] = @PackageType_Name
AND (([PackageGroup_Name] IS NULL AND @PackageGroup_Name IS NULL) OR ([PackageGroup_Name] = @PackageGroup_Name))
AND (([PackageGroup_Name] IS NULL AND @PackageGroup_Name IS NULL) OR ([PackageGroup_Name] = @PackageGroup_Name))
AND [Package_Name] = @Package_Name
AND [Package_Name] = @Package_Name
ELSE
ELSE
SELECT @PackageName_Id = [PackageName_Id]
SELECT @PackageName_Id = [PackageName_Id]
FROM [PackageNameIds] WITH (NOLOCK)
FROM [PackageNameIds] WITH (NOLOCK)
WHERE [PackageType_Name] = @PackageType_Name
WHERE [PackageType_Name] = @PackageType_Name
AND (([PackageGroup_Name_Lower] IS NULL AND @PackageGroup_Name IS NULL) OR ([PackageGroup_Name_Lower] = LOWER(@PackageGroup_Name)))
AND (([PackageGroup_Name_Lower] IS NULL AND @PackageGroup_Name IS NULL) OR ([PackageGroup_Name_Lower] = LOWER(@PackageGroup_Name)))
AND [Package_Name_Lower] = LOWER(@Package_Name)
AND [Package_Name_Lower] = LOWER(@Package_Name)
END CATCH
END CATCH
END
END