簡體   English   中英

如何使用變量在SQL Server中指定文件組

[英]How to use a variable to specify filegroup in 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'

但是,最后一行失敗,因為看起來文件組不能由變量指定。

這可能嗎?

我發現動態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)

我希望有幫助....

我相信如果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'

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM