2010-06-11 61 views
4

我想在SQL Server数据库升级期间更改表以添加约束。如何使用变量在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' 

然而,因为它出现文件组不能由变量指定的最后一行将失败。

这可能吗?

回答

2

我发现,在DDL语句传递变量时动态SQL工作。

尝试是这样的:

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) 

我希望帮助....

+0

谢谢,我已经走了,尽管它比解决方案更像是一种解决方法。不知道为什么变量不允许在那里。 – 2010-06-16 00:09:36

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' 
+0

好主意 - 这两个答案都失去了语法高亮和其之间的权衡代码重复! – 2010-06-16 00:11:00

0

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

相关问题