0

I am having troubles when trying to pass variables of different types into a stored procedure that receives the variables as SQL_Variants.

Here is the stored procedure I am calling:

CREATE PROCEDURE [dbo].[usp_GetOrCreateCorrespondenceBatchID]
    @CorrespondenceBatchName VARCHAR(100)
    , @CorrespondenceTypeId int
    , @CorrespondenceBatchId INT OUTPUT
    , @isNewlyCreatedBatch BIT OUTPUT
    , @ParameterName01 NVARCHAR(100) = null, @ParamenterValue01 SQL_VARIANT = null
    , @ParameterName02 NVARCHAR(100) = null, @ParamenterValue02 SQL_VARIANT = null
    , @ParameterName03 NVARCHAR(100) = null, @ParamenterValue03 SQL_VARIANT = null
    , @ParameterName04 NVARCHAR(100) = null, @ParamenterValue04 SQL_VARIANT = null
    , @ParameterName05 NVARCHAR(100) = null, @ParamenterValue05 SQL_VARIANT = null
    , @ParameterName06 NVARCHAR(100) = null, @ParamenterValue06 SQL_VARIANT = null
    , @ParameterName07 NVARCHAR(100) = null, @ParamenterValue07 SQL_VARIANT = null
    , @ParameterName08 NVARCHAR(100) = null, @ParamenterValue08 SQL_VARIANT = null
    , @ParameterName09 NVARCHAR(100) = null, @ParamenterValue09 SQL_VARIANT = null
    , @ParameterName10 NVARCHAR(100) = null, @ParamenterValue10 SQL_VARIANT = null
AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
        SET NOCOUNT ON;

        SET @isNewlyCreatedBatch = 0
        SET @CorrespondenceBatchId = NULL;

        SELECT  @CorrespondenceBatchId = CorrespondenceBatch.CorrespondenceBatchID
            FROM    dbo.CorrespondenceBatch
            WHERE   CorrespondenceBatch.[Name] = @CorrespondenceBatchName

        IF @CorrespondenceBatchId IS NULL
        BEGIN
            SET @isNewlyCreatedBatch = 1
            INSERT INTO dbo.CorrespondenceBatch
                    ( CreatedBy
                    , CreatedDate
                    , LastModifiedBy
                    , LastModifiedDate
                    , CorrespondenceTypeID
                    , [Name]
                    )
            VALUES  ( SUSER_SNAME()  -- CreatedBy - nvarchar(50)
                    , GETUTCDATE()  -- CreatedDate - datetime
                    , SUSER_SNAME()  -- LastModifiedBy - nvarchar(50)
                    , GETUTCDATE()  -- LastModifiedDate - datetime
                    , @CorrespondenceTypeId
                    , @CorrespondenceBatchName  -- Name - nvarchar(100)
                    )
            SET @CorrespondenceBatchId = SCOPE_IDENTITY() 
            IF @ParameterName01 IS NOT NULL
            BEGIN 
                 IF SQL_VARIANT_PROPERTY(@ParamenterValue01, 'BaseType') IN ('datetime', 'smalldatetime', 'datetime2', 'date', 'time')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDateTime )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName01, CONVERT(VARCHAR(MAX),@ParamenterValue01, 121), CONVERT(DATETIME, @ParamenterValue01))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue01, 'BaseType') IN ('bigint', 'int', 'smallint', 'tinyint', 'bit')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueBigInt )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName01, CONVERT(VARCHAR(MAX),@ParamenterValue01), CONVERT(BIGINT, @ParamenterValue01))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue01, 'BaseType') IN ('decimal', 'money', 'smallmoney')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName01, CONVERT(VARCHAR(MAX),@ParamenterValue01), CONVERT(DECIMAL(18,6), @ParamenterValue01))
                 END
                 ELSE
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString)VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName01, CONVERT(VARCHAR(MAX),@ParamenterValue01))
                 END
            END
            IF @ParameterName02 IS NOT NULL
            BEGIN 
                 IF SQL_VARIANT_PROPERTY(@ParamenterValue02, 'BaseType') IN ('datetime', 'smalldatetime', 'datetime2', 'date', 'time')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDateTime )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName02, CONVERT(VARCHAR(MAX),@ParamenterValue02, 121), CONVERT(DATETIME, @ParamenterValue02))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue02, 'BaseType') IN ('bigint', 'int', 'smallint', 'tinyint', 'bit')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueBigInt )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName02, CONVERT(VARCHAR(MAX),@ParamenterValue02), CONVERT(BIGINT, @ParamenterValue02))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue02, 'BaseType') IN ('decimal', 'money', 'smallmoney')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName02, CONVERT(VARCHAR(MAX),@ParamenterValue02), CONVERT(DECIMAL(18,6), @ParamenterValue02))
                 END
                 ELSE
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString)VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName02, CONVERT(VARCHAR(MAX),@ParamenterValue02))
                 END
            END
            IF @ParameterName03 IS NOT NULL
            BEGIN 
                 IF SQL_VARIANT_PROPERTY(@ParamenterValue03, 'BaseType') IN ('datetime', 'smalldatetime', 'datetime2', 'date', 'time')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDateTime )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName03, CONVERT(VARCHAR(MAX),@ParamenterValue03, 121), CONVERT(DATETIME, @ParamenterValue03))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue03, 'BaseType') IN ('bigint', 'int', 'smallint', 'tinyint', 'bit')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueBigInt )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName03, CONVERT(VARCHAR(MAX),@ParamenterValue03), CONVERT(BIGINT, @ParamenterValue03))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue03, 'BaseType') IN ('decimal', 'money', 'smallmoney')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName03, CONVERT(VARCHAR(MAX),@ParamenterValue03), CONVERT(DECIMAL(18,6), @ParamenterValue03))
                 END
                 ELSE
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString)VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName03, CONVERT(VARCHAR(MAX),@ParamenterValue03))
                 END
            END
            IF @ParameterName04 IS NOT NULL
            BEGIN 
                 IF SQL_VARIANT_PROPERTY(@ParamenterValue04, 'BaseType') IN ('datetime', 'smalldatetime', 'datetime2', 'date', 'time')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDateTime )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName04, CONVERT(VARCHAR(MAX),@ParamenterValue04, 121), CONVERT(DATETIME, @ParamenterValue04))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue04, 'BaseType') IN ('bigint', 'int', 'smallint', 'tinyint', 'bit')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueBigInt )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName04, CONVERT(VARCHAR(MAX),@ParamenterValue04), CONVERT(BIGINT, @ParamenterValue04))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue04, 'BaseType') IN ('decimal', 'money', 'smallmoney')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName04, CONVERT(VARCHAR(MAX),@ParamenterValue04), CONVERT(DECIMAL(18,6), @ParamenterValue04))
                 END
                 ELSE
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString)VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName04, CONVERT(VARCHAR(MAX),@ParamenterValue04))
                 END
            END
            IF @ParameterName05 IS NOT NULL
            BEGIN 
                 IF SQL_VARIANT_PROPERTY(@ParamenterValue05, 'BaseType') IN ('datetime', 'smalldatetime', 'datetime2', 'date', 'time')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDateTime )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName05, CONVERT(VARCHAR(MAX),@ParamenterValue05, 121), CONVERT(DATETIME, @ParamenterValue05))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue05, 'BaseType') IN ('bigint', 'int', 'smallint', 'tinyint', 'bit')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueBigInt )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName05, CONVERT(VARCHAR(MAX),@ParamenterValue05), CONVERT(BIGINT, @ParamenterValue05))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue05, 'BaseType') IN ('decimal', 'money', 'smallmoney')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName05, CONVERT(VARCHAR(MAX),@ParamenterValue05), CONVERT(DECIMAL(18,6), @ParamenterValue05))
                 END
                 ELSE
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString)VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName05, CONVERT(VARCHAR(MAX),@ParamenterValue05))
                 END
            END
            IF @ParameterName06 IS NOT NULL
            BEGIN 
                 IF SQL_VARIANT_PROPERTY(@ParamenterValue06, 'BaseType') IN ('datetime', 'smalldatetime', 'datetime2', 'date', 'time')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDateTime )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName06, CONVERT(VARCHAR(MAX),@ParamenterValue06, 121), CONVERT(DATETIME, @ParamenterValue06))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue06, 'BaseType') IN ('bigint', 'int', 'smallint', 'tinyint', 'bit')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueBigInt )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName06, CONVERT(VARCHAR(MAX),@ParamenterValue06), CONVERT(BIGINT, @ParamenterValue06))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue06, 'BaseType') IN ('decimal', 'money', 'smallmoney')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName06, CONVERT(VARCHAR(MAX),@ParamenterValue06), CONVERT(DECIMAL(18,6), @ParamenterValue06))
                 END
                 ELSE
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString)VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName06, CONVERT(VARCHAR(MAX),@ParamenterValue06))
                 END
            END
            IF @ParameterName07 IS NOT NULL
            BEGIN 
                 IF SQL_VARIANT_PROPERTY(@ParamenterValue07, 'BaseType') IN ('datetime', 'smalldatetime', 'datetime2', 'date', 'time')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDateTime )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName07, CONVERT(VARCHAR(MAX),@ParamenterValue07, 121), CONVERT(DATETIME, @ParamenterValue07))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue07, 'BaseType') IN ('bigint', 'int', 'smallint', 'tinyint', 'bit')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueBigInt )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName07, CONVERT(VARCHAR(MAX),@ParamenterValue07), CONVERT(BIGINT, @ParamenterValue07))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue07, 'BaseType') IN ('decimal', 'money', 'smallmoney')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName07, CONVERT(VARCHAR(MAX),@ParamenterValue07), CONVERT(DECIMAL(18,6), @ParamenterValue07))
                 END
                 ELSE
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString)VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName07, CONVERT(VARCHAR(MAX),@ParamenterValue07))
                 END
            END
            IF @ParameterName08 IS NOT NULL
            BEGIN 
                 IF SQL_VARIANT_PROPERTY(@ParamenterValue08, 'BaseType') IN ('datetime', 'smalldatetime', 'datetime2', 'date', 'time')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDateTime )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName08, CONVERT(VARCHAR(MAX),@ParamenterValue08, 121), CONVERT(DATETIME, @ParamenterValue08))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue08, 'BaseType') IN ('bigint', 'int', 'smallint', 'tinyint', 'bit')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueBigInt )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName08, CONVERT(VARCHAR(MAX),@ParamenterValue08), CONVERT(BIGINT, @ParamenterValue08))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue08, 'BaseType') IN ('decimal', 'money', 'smallmoney')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName08, CONVERT(VARCHAR(MAX),@ParamenterValue08), CONVERT(DECIMAL(18,6), @ParamenterValue08))
                 END
                 ELSE
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString)VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName08, CONVERT(VARCHAR(MAX),@ParamenterValue08))
                 END
            END
            IF @ParameterName09 IS NOT NULL
            BEGIN 
                 IF SQL_VARIANT_PROPERTY(@ParamenterValue09, 'BaseType') IN ('datetime', 'smalldatetime', 'datetime2', 'date', 'time')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDateTime )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName09, CONVERT(VARCHAR(MAX),@ParamenterValue09, 121), CONVERT(DATETIME, @ParamenterValue09))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue09, 'BaseType') IN ('bigint', 'int', 'smallint', 'tinyint', 'bit')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueBigInt )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName09, CONVERT(VARCHAR(MAX),@ParamenterValue09), CONVERT(BIGINT, @ParamenterValue09))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue09, 'BaseType') IN ('decimal', 'money', 'smallmoney')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName09, CONVERT(VARCHAR(MAX),@ParamenterValue09), CONVERT(DECIMAL(18,6), @ParamenterValue09))
                 END
                 ELSE
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString)VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName09, CONVERT(VARCHAR(MAX),@ParamenterValue09))
                 END
            END
            IF @ParameterName10 IS NOT NULL
            BEGIN 
                 IF SQL_VARIANT_PROPERTY(@ParamenterValue10, 'BaseType') IN ('datetime', 'smalldatetime', 'datetime2', 'date', 'time')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDateTime )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName10, CONVERT(VARCHAR(MAX),@ParamenterValue10, 121), CONVERT(DATETIME, @ParamenterValue10))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue10, 'BaseType') IN ('bigint', 'int', 'smallint', 'tinyint', 'bit')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueBigInt )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName10, CONVERT(VARCHAR(MAX),@ParamenterValue10), CONVERT(BIGINT, @ParamenterValue10))
                 END
                 ELSE IF SQL_VARIANT_PROPERTY(@ParamenterValue10, 'BaseType') IN ('decimal', 'money', 'smallmoney')
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName10, CONVERT(VARCHAR(MAX),@ParamenterValue10), CONVERT(DECIMAL(18,6), @ParamenterValue10))
                 END
                 ELSE
                 BEGIN
                    INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, Name, ValueString)VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName10, CONVERT(VARCHAR(MAX),@ParamenterValue10))
                 END
            END
        END
    END

Here is my call to this stored procedure from another stored procedure:

    EXEC dbo.usp_GetOrCreateCorrespondenceBatchID @CorrespondenceBatchName, @CorrespondenceTypeId, @CorrespondenceBatchId OUTPUT,
        @isNewlyCreatedBatch OUTPUT, N'StartDate', @StartDate, N'EndDate', @EndDate, N'PopulationID', @PopulationID

When I try to debug this call / stored procedure the debugger skips over this stored procedure and the output parameters are never set. Yes, I am confident in my debugging procedure... tried both SSMS and VisualStudio 2015. Both seem to step over this call when debugging. Sometimes this call does work properly and the usp_GetOrCreateCorrespondenceBatchID does execute properly. After a few days trying to trace down the problem I can not find a distinct case where the call always works vs not working. This stored procedure is called from many parent stored procedures. I can find no consistency in calling stored procedures that always work and those that do not work. Sometimes calling stored procedure A does work and most of the time it doesn't.

The parameter table is pretty simple:

CREATE TABLE [dbo].[CorrespondenceBatchParameter](
    [CorrespondenceBatchParameterID] [bigint] IDENTITY(1,1) NOT NULL,
    [CreatedBy] [nvarchar](50) NOT NULL,
    [CreatedDate] [datetime] NOT NULL,
    [LastModifiedBy] [nvarchar](50) NOT NULL,
    [LastModifiedDate] [datetime] NOT NULL,
    [CorrespondenceBatchID] [int] NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [ValueString] [nvarchar](max) NULL,
    [ValueBigInt] [bigint] NULL,
    [ValueDateTime] [datetime] NULL,
    [ValueDecimal] [numeric](18, 6) NULL,
 CONSTRAINT [PK_CorrespondenceBatchParameter] PRIMARY KEY CLUSTERED 
(
    [CorrespondenceBatchParameterID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

The reason for passing in the parameters as sql_variant is different batches will have different parameters of different types and it is a whole lot easier to select the proper type value later without having to cast when selecting.

What am I doing wrong?

I could store just the string values of the parameters and cast them when selecting them out of the parameters table. I will go this route if I can't figure out why this call is not functioning properly.

Is this just a weakness of the SQL_Variant type? Is there something misconfigured on the SQL server?

SQL Server 2012 standard. Database version is the same.

  • 2
    This looks like a nightmare to debug and maintain. And what happens when you suddenly need 14 parameters? This has the look of a procedure that is receiving parameters that will be used by another procedure. Something seems a bit too loosey goosey here to be a really good design. Just the wide inclusion of sql_variant is a bit dodgy. Here is a great question on using that datatype. https://stackoverflow.com/questions/9039455/should-i-use-sql-variant-data-type – Sean Lange Mar 06 '18 at 19:35
  • The parameter table does not store the parameter values as variants... been there, I don't like tables with variants... (all sorts of problems with variant columns). I am in the process of rewriting the system to store the parameters as string values (varchar()) and casting them when retrieving them. I was just hoping someone might see something obvious that I am doing wrong, or have tried to implement something similar and found sql_variant's just don't work as I am trying to use them? – MichaelInOr Mar 06 '18 at 19:39
  • Your question is not clear. You say that your procedure sometimes works and sometimes doesn't. How do you know? What exactly do you do to determine this. In addition, you ask "what am I doing wrong?". In what context are you asking? Is this a debugging question? Or is it a question of logic design/implementation? At the very least, you could create a table to log each execution of this procedure - such a table would contain columns of the same time/name as your parameters (with some additional auditing information). Perhaps that will help. – SMor Mar 06 '18 at 20:38
  • And I will add that you need to try using some coding best practices. Inconsistency is never a good habit. Start terminating all your statements. Assign a scalar variable with a set statement, not a select statement. A procedure name that both "gets" and "sets" is a problem in many ways. If the name exists in your table, you effectively ignore all the parameters and do nothing. This does not have a good smell, but "improving it" is your time/money. – SMor Mar 06 '18 at 20:44
  • And name does not have a unique constraint - that seems like a problem if you are using it as a key to your logic. – SMor Mar 06 '18 at 20:45

1 Answers1

0

Well this is what I ended up with. Functionally does the same thing without using sql_variants.

CREATE PROCEDURE [dbo].[usp_GetOrCreateCorrespondenceBatchID]
    -- Add the parameters for the stored procedure here
    @CorrespondenceBatchName VARCHAR(100)
    , @CorrespondenceTypeId int
    , @CorrespondenceBatchId INT OUTPUT
    , @isNewlyCreatedBatch BIT OUTPUT
    , @ParameterName01 NVARCHAR(100) = null, @ParamenterValue01 VARCHAR(MAX) = null
    , @ParameterName02 NVARCHAR(100) = null, @ParamenterValue02 VARCHAR(MAX) = null
    , @ParameterName03 NVARCHAR(100) = null, @ParamenterValue03 VARCHAR(MAX) = null
    , @ParameterName04 NVARCHAR(100) = null, @ParamenterValue04 VARCHAR(MAX) = null
    , @ParameterName05 NVARCHAR(100) = null, @ParamenterValue05 VARCHAR(MAX) = null
    , @ParameterName06 NVARCHAR(100) = null, @ParamenterValue06 VARCHAR(MAX) = null
    , @ParameterName07 NVARCHAR(100) = null, @ParamenterValue07 VARCHAR(MAX) = null
    , @ParameterName08 NVARCHAR(100) = null, @ParamenterValue08 VARCHAR(MAX) = null
    , @ParameterName09 NVARCHAR(100) = null, @ParamenterValue09 VARCHAR(MAX) = null
    , @ParameterName10 NVARCHAR(100) = null, @ParamenterValue10 VARCHAR(MAX) = null
AS
    BEGIN
        SET NOCOUNT ON;

        SET @isNewlyCreatedBatch = 0
        SET @CorrespondenceBatchId = NULL;

        SELECT  @CorrespondenceBatchId = CorrespondenceBatch.CorrespondenceBatchID
            FROM    dbo.CorrespondenceBatch
            WHERE   CorrespondenceBatch.[Name] = @CorrespondenceBatchName

        IF @CorrespondenceBatchId IS NULL
        BEGIN
            SET @isNewlyCreatedBatch = 1
            INSERT INTO dbo.CorrespondenceBatch
                    ( CreatedBy
                    , CreatedDate
                    , LastModifiedBy
                    , LastModifiedDate
                    , CorrespondenceTypeID
                    , [Name]
                    )
            VALUES  ( SUSER_SNAME()  -- CreatedBy - nvarchar(50)
                    , GETUTCDATE()  -- CreatedDate - datetime
                    , SUSER_SNAME()  -- LastModifiedBy - nvarchar(50)
                    , GETUTCDATE()  -- LastModifiedDate - datetime
                    , @CorrespondenceTypeId
                    , @CorrespondenceBatchName  -- Name - nvarchar(100)
                    )
            SET @CorrespondenceBatchId = SCOPE_IDENTITY() 


            IF @ParameterName01 IS NOT NULL INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, [Name], ValueString, ValueDateTime, ValueBigInt, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName01, TRY_CAST(@ParamenterValue01 AS VARCHAR(max)), TRY_CAST(@ParamenterValue01 AS DATETIME), TRY_CAST(@ParamenterValue01 AS BIGINT), TRY_CAST(@ParamenterValue01 AS DECIMAL))
            IF @ParameterName02 IS NOT NULL INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, [Name], ValueString, ValueDateTime, ValueBigInt, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName02, TRY_CAST(@ParamenterValue02 AS VARCHAR(max)), TRY_CAST(@ParamenterValue02 AS DATETIME), TRY_CAST(@ParamenterValue02 AS BIGINT), TRY_CAST(@ParamenterValue02 AS DECIMAL))
            IF @ParameterName03 IS NOT NULL INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, [Name], ValueString, ValueDateTime, ValueBigInt, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName03, TRY_CAST(@ParamenterValue03 AS VARCHAR(max)), TRY_CAST(@ParamenterValue03 AS DATETIME), TRY_CAST(@ParamenterValue03 AS BIGINT), TRY_CAST(@ParamenterValue03 AS DECIMAL))
            IF @ParameterName04 IS NOT NULL INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, [Name], ValueString, ValueDateTime, ValueBigInt, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName04, TRY_CAST(@ParamenterValue04 AS VARCHAR(max)), TRY_CAST(@ParamenterValue04 AS DATETIME), TRY_CAST(@ParamenterValue04 AS BIGINT), TRY_CAST(@ParamenterValue04 AS DECIMAL))
            IF @ParameterName05 IS NOT NULL INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, [Name], ValueString, ValueDateTime, ValueBigInt, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName05, TRY_CAST(@ParamenterValue05 AS VARCHAR(max)), TRY_CAST(@ParamenterValue05 AS DATETIME), TRY_CAST(@ParamenterValue05 AS BIGINT), TRY_CAST(@ParamenterValue05 AS DECIMAL))
            IF @ParameterName06 IS NOT NULL INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, [Name], ValueString, ValueDateTime, ValueBigInt, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName06, TRY_CAST(@ParamenterValue06 AS VARCHAR(max)), TRY_CAST(@ParamenterValue06 AS DATETIME), TRY_CAST(@ParamenterValue06 AS BIGINT), TRY_CAST(@ParamenterValue06 AS DECIMAL))
            IF @ParameterName07 IS NOT NULL INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, [Name], ValueString, ValueDateTime, ValueBigInt, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName07, TRY_CAST(@ParamenterValue07 AS VARCHAR(max)), TRY_CAST(@ParamenterValue07 AS DATETIME), TRY_CAST(@ParamenterValue07 AS BIGINT), TRY_CAST(@ParamenterValue07 AS DECIMAL))
            IF @ParameterName08 IS NOT NULL INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, [Name], ValueString, ValueDateTime, ValueBigInt, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName08, TRY_CAST(@ParamenterValue08 AS VARCHAR(max)), TRY_CAST(@ParamenterValue08 AS DATETIME), TRY_CAST(@ParamenterValue08 AS BIGINT), TRY_CAST(@ParamenterValue08 AS DECIMAL))
            IF @ParameterName09 IS NOT NULL INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, [Name], ValueString, ValueDateTime, ValueBigInt, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName09, TRY_CAST(@ParamenterValue09 AS VARCHAR(max)), TRY_CAST(@ParamenterValue09 AS DATETIME), TRY_CAST(@ParamenterValue09 AS BIGINT), TRY_CAST(@ParamenterValue09 AS DECIMAL))
            IF @ParameterName10 IS NOT NULL INSERT INTO dbo.CorrespondenceBatchParameter ( CreatedBy, CreatedDate, LastModifiedBy, LastModifiedDate, CorrespondenceBatchID, [Name], ValueString, ValueDateTime, ValueBigInt, ValueDecimal )VALUES  ( SUSER_SNAME(), GETUTCDATE(), SUSER_SNAME(), GETUTCDATE(), @CorrespondenceBatchId, @ParameterName10, TRY_CAST(@ParamenterValue10 AS VARCHAR(max)), TRY_CAST(@ParamenterValue10 AS DATETIME), TRY_CAST(@ParamenterValue10 AS BIGINT), TRY_CAST(@ParamenterValue10 AS DECIMAL))

        END
    END

When stepping through the calling SP in debug mode it would just skip over the call to usp_GetOrCreateCorrespondenceBatchID. By putting the call in a TRY/CATCH I was able to get an actual error of "Cannot convert DATETIME to BIGINT" when making the call. As in SQL was interpreting sql_variant as a BIGINT. By changing the parameter type from SQL_VARIANT to VARCHAR(MAX) I no longer receive this error and the SP functions properly.

I have been burned by SQL_VARIANT in the past! I guess I will no longer use SQL_VARIANT's.