Search code examples
sqlsql-serverstored-procedures

Uniqueidentifier not working in stored procedure?


I'm trying to establish a NEWID() (copy) and getting error that uniqueidentifier is incompatible with int - what am I doing wrong?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[ReleasedVersionCopy]
AS
    INSERT INTO Template (Template_Name, DeptID, TemplateOwnerID, Created_Date, Last_Update, Released_Date, IsPublished, IsDeleted)
        SELECT 
            Template_Name + ' - Copy3', DeptID, TemplateOwnerID, 
            Created_Date, Last_Update, Released_Date, 
            IsPublished, IsDeleted 
        FROM 
            Template
        WHERE 
            TemplateID = 2

DECLARE @TemplateID uniqueidentifier;
SET @TemplateID = NEWID()

INSERT INTO Panel (Panel_Name, TemplateID, Panel_Order)
    SELECT Panel_Name, @TemplateID, Panel_Order
    FROM Panel
    WHERE TemplateID = 2

DECLARE @Cntr INTEGER = 0;

WHILE @Cntr < 5
BEGIN;
    SET @Cntr = @Cntr + 1;

    DECLARE @PanelID uniqueidentifier;
    SET @PanelID = NEWID()

    INSERT INTO Field (Field_Name, PanelID, FieldTypeID, PlacementH, Field_Order)
        SELECT Field_Name, @PanelID, FieldTypeID, PlacementH, Field_Order
        FROM Field
        INNER JOIN Panel ON Field.PanelID = Panel.PanelID
        INNER JOIN Template ON Panel.TemplateID = Template.TemplateID
        WHERE Template.TemplateID = 2
    END;

This is the error I'm getting:

Msg 206, Level 16, State 2, Procedure ReleasedVersionCopy, Line 16 [Batch Start Line 7]
Operand type clash: uniqueidentifier is incompatible with int

Msg 206, Level 16, State 2, Procedure ReleasedVersionCopy, Line 32 [Batch Start Line 7]
Operand type clash: uniqueidentifier is incompatible with int

Here is Template

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Template]
(
    [TemplateID] [int] IDENTITY(1,1) NOT NULL,
    [Template_Name] [nvarchar](255) NOT NULL,
    [DeptID] [int] NOT NULL,
    [TemplateOwnerID] [nvarchar](6) NOT NULL,
    [Created_Date] [datetime] NOT NULL,
    [Last_Update] [datetime] NULL,
    [Released_Date] [datetime] NULL,
    [IsPublished] [bit] NOT NULL,
    [IsDeleted] [bit] NOT NULL,

    CONSTRAINT [PK_Template] 
        PRIMARY KEY CLUSTERED ([TemplateID] ASC)
                WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
                      IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                      ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Template]  WITH CHECK 
    ADD CONSTRAINT [FK_Template_Dept] 
        FOREIGN KEY([DeptID]) REFERENCES [dbo].[Dept] ([DeptID])
GO

ALTER TABLE [dbo].[Template] CHECK CONSTRAINT [FK_Template_Dept]
GO

Here is Panel

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Panel]
(
    [PanelID] [int] IDENTITY(1,1) NOT NULL,
    [Panel_Name] [nvarchar](255) NOT NULL,
    [TemplateID] [int] NOT NULL,
    [Panel_Order] [int] NOT NULL,

    CONSTRAINT [PK_Panel] 
        PRIMARY KEY CLUSTERED ([PanelID] ASC)
                WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                      IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                      ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Panel]  WITH CHECK 
    ADD CONSTRAINT [FK_Panel_Template] 
        FOREIGN KEY([TemplateID]) REFERENCES [dbo].[Template] ([TemplateID])
GO

ALTER TABLE [dbo].[Panel] CHECK CONSTRAINT [FK_Panel_Template]
GO

Solution

  • Taking this as an example:

    [TemplateID] [int] IDENTITY(1,1) NOT NULL
    

    A value is assigned to this column as you are using identity, and this is defined as an int.

    To allow this to work you either need to create a new column in the table schemas of a uniqueidentifier or change the table structure to make templateid a guid.

    I personally would review why you are trying to use a GUID, but assuming you still need it, add in a new column to accommodate it as when you start to look at indexing having an integer based pk will be beneficial.