2010-06-11 9 views
4

Je souhaite modifier une table pour ajouter une contrainte lors de la mise à niveau sur une base de données SQL Server.Comment utiliser une variable pour spécifier le groupe de fichiers dans SQL Server

Cette table est normalement indexée sur un groupe de fichiers appelé 'MY_INDEX' - mais peut également être dans une base de données sans ce groupe de fichiers. Dans ce cas, je veux que l'indexation soit faite sur le groupe de fichiers 'PRIMARY'.

J'ai essayé le code suivant pour y parvenir:

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' 

Cependant, la dernière ligne échoue car il semble un groupe de fichiers ne peut pas être spécifié par la variable.

Est-ce possible?

Répondre

2

J'ai trouvé que SQL dynamique fonctionne lors du passage des variables dans les instructions DDL.

Essayez quelque chose comme ceci:

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) 

J'espère que cela ....

+0

Merci, je suis allé avec cela, même si c'est plus une solution de contournement qu'une solution. Je me demande pourquoi les variables ne sont pas autorisées ici. –

1

Je crois que si SQL Server renvoie un incorrect syntax, il n'y a probablement aucun moyen de le faire, malheureusement.

Vous devrez spécifier vos noms de groupes de fichiers en tant que littéraux de chaîne.

Vous aurez probablement juste de réécrire votre script pour être quelque chose comme:

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

Bonne idée - les deux réponses sont un compromis entre la perte de coloration syntaxique et ayant duplication de code! –

0

Remplacer ELSE QUOTENAME('PRIMARY') avec ELSE QUOTENAME('[PRIMARY]')