我想在SQL Server数据库升级期间更改表以添加约束。
此表通常在名为“MY_INDEX”的文件组上编制索引 - 但也可能位于没有此文件组的数据库上。在这种情况下,我希望索引在'PRIMARY'文件组上完成。
我尝试了以下代码来实现这一目标:
DECLARE @fgName AS VARCHAR(10)
SET @fgName = CASE WHEN EXISTS(SELECT groupname
FROM sysfilegroups
WHERE groupname = 'MY_INDEX')
THEN QUOTENAME('MY_INDEX')
ELSE QUOTENAME('PRIMARY')
END
ALTER TABLE [dbo].[mytable]
ADD CONSTRAINT [PK_mytable] PRIMARY KEY
(
[myGuid] ASC
)
ON @fgName -- fails: 'incorrect syntax'
但是,最后一行失败,因为看起来无法通过变量指定文件组。
这可能吗?
答案 0 :(得分:2)
我发现动态sql在DDL语句中传递变量时有效。
尝试这样的事情:
DECLARE @fgName AS VARCHAR(10)
SET @fgName = CASE WHEN EXISTS(SELECT groupname
FROM sysfilegroups
WHERE groupname = 'MY_INDEX')
THEN QUOTENAME('MY_INDEX')
ELSE QUOTENAME('PRIMARY')
END
DECLARE @sql as varchar(1024)
SET @sql = 'ALTER TABLE [dbo].[mytable] ADD CONSTRAINT [PK_mytable] PRIMARY KEY (
[myGuid] ASC ) ON ' + @fgName
EXEC(@sql)
我希望有帮助......
答案 1 :(得分:1)
我相信如果SQL Server返回incorrect syntax
,很遗憾可能无法做到这一点。
您需要将文件组名称指定为字符串文字。
您可能只需将脚本重写为:
IF EXISTS(SELECT groupname FROM sysfilegroups WHERE groupname = 'MY_INDEX')
ALTER TABLE [dbo].[mytable]
ADD CONSTRAINT [PK_mytable]
PRIMARY KEY([myGuid] ASC) ON 'MY_INDEX'
ELSE
ALTER TABLE [dbo].[mytable]
ADD CONSTRAINT [PK_mytable]
PRIMARY KEY([myGuid] ASC) ON 'PRIMARY'
答案 2 :(得分:0)
将ELSE QUOTENAME('PRIMARY')
替换为ELSE QUOTENAME('[PRIMARY]')