Как использовать переменную для указания файловой группы в SQL Server - PullRequest
4 голосов
/ 11 июня 2010

Я хочу изменить таблицу, чтобы добавить ограничение во время обновления базы данных 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'

Однако последняя строка завершается сбоем, как кажетсяфайловая группа не может быть указана с помощью переменной.

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 12 июня 2010

Я обнаружил, что динамический 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)

Надеюсь, это поможет ....

1 голос
/ 11 июня 2010

Я полагаю, что если 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 голосов
/ 11 января 2014

Заменить ELSE QUOTENAME('PRIMARY') на ELSE QUOTENAME('[PRIMARY]')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...