I've jut recently scripted out a table from an existing DB on one of our SQL Servers, which brings back the following glorious result:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[queuemembership](
[Id] [uniqueidentifier] NOT NULL,
[versionnumber] [bigint] NULL,
[queueid] [uniqueidentifier] NULL,
[queuemembershipid] [uniqueidentifier] NULL,
[systemuserid] [uniqueidentifier] NULL,
CONSTRAINT [EPK[dbo]].[queuemembership]]] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
I'm not familiar with the EPK bit of CONSTRAINT [EPK[dbo]].[queuemembership]]] PRIMARY KEY CLUSTERED
If I recreate the table from scratch I can replace EPK with other text, which makes me think this is some sort of external metadata or something.
Can anyone shed any light on this?
CodePudding user response:
I've covered this in the comments, but to put it into an answer, [EPK[dbo]].[queuemembership]]] is a delimit identified and properly escaped value for an object (specifically a CONSTRAINT) called EPK[dbo].[queuemembership].
This is, in truth, a very poorly named object; it contains multiple different characters that require the name to need to be delimit identified and a multiple characters that need escaping. Any of the right brackets (]) need escaping, in the same way that you would a single quote (') in a literal string; double them up. Then, because of the said right brackets, as well as the left brackets ([) and the periods (.), which is a part separator, this means that the entire value needs to be delimit identified.
As a result, you end up with that value [EPK[dbo]].[queuemembership]]]. You can also double check this by running PRINT QUOTENAME(N'EPK[dbo].[queuemembership]');.
Honestly, I suggest naming you CONSTRAINT something better, that doesn't need delimit identification or escaping. PK_queuemembership is likely more than fine.
