2010-06-11 62 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]')

相關問題