如何在SQL Server中使用变量指定文件组
我想更改一个表,以便在升级SQL Server数据库时添加约束 此表通常在名为“MY_INDEX”的文件组上建立索引,但也可能在没有此文件组的数据库上。在这种情况下,我希望对“主”文件组进行索引 我尝试了以下代码来实现这一点:如何在SQL Server中使用变量指定文件组,sql,sql-server,indexing,filegroup,Sql,Sql Server,Indexing,Filegroup,我想更改一个表,以便在升级SQL Server数据库时添加约束 此表通常在名为“MY_INDEX”的文件组上建立索引,但也可能在没有此文件组的数据库上。在这种情况下,我希望对“主”文件组进行索引 我尝试了以下代码来实现这一点: DECLARE @fgName AS VARCHAR(10) SET @fgName = CASE WHEN EXISTS(SELECT groupname FROM sysfilegroups
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'
但是,最后一行失败,因为似乎无法通过变量指定文件组
这可能吗?我认为,如果SQL Server返回的
语法不正确,很遗憾,可能无法做到这一点
您需要将文件组名称指定为字符串文字
您可能只需要将脚本重写为以下内容:
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'
我发现动态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)
我希望这有助于……用ELSE QUOTENAME(“[PRIMARY]”)替换ELSE QUOTENAME('PRIMARY')
)
谢谢,我同意了这一点,尽管这更像是一种解决方法,而不是一种解决方案。想知道为什么这里不允许使用变量。好主意-这两个答案是在丢失语法突出显示和代码重复之间的折衷!