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

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)

それが役立つことを願っています....

于 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 に答える