4

我想在升级 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'

但是,最后一行失败,因为它似乎无法通过变量指定文件组。

这可能吗?

4

3 回答 3

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)

我希望这有帮助....

于 2010-06-11T23:32:43.837 回答
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'
于 2010-06-11T11:40:04.430 回答
0

替换ELSE QUOTENAME('PRIMARY')ELSE QUOTENAME('[PRIMARY]')

于 2014-01-11T18:48:19.857 回答