如何在SQL Server中使用变量指定文件组

如何在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

我想更改一个表,以便在升级SQL Server数据库时添加约束

此表通常在名为“MY_INDEX”的文件组上建立索引,但也可能在没有此文件组的数据库上。在这种情况下,我希望对“主”文件组进行索引

我尝试了以下代码来实现这一点:

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')

谢谢,我同意了这一点,尽管这更像是一种解决方法,而不是一种解决方案。想知道为什么这里不允许使用变量。好主意-这两个答案是在丢失语法突出显示和代码重复之间的折衷!