2010-06-11 5 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

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

Я надеюсь, что помогает ....

+0

Спасибо, я пошел с этим, хотя это скорее обходное решение, чем решение. Интересно, почему переменные там не допускаются. –

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

Хорошей идеи - два ответа является компромиссом между потерей подсветки синтаксиса и имеющей дублирование кода! –

0

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

Смежные вопросы