web-dev-qa-db-fra.com

Existe-t-il un moyen d'exécuter l'instruction SQL basée sur la version SQL Server?

Je souhaite créer un index calculé sur une table si SQL Server est 2008 ou plus récent et un index simple si SQL Server est 2005 ou plus:

-- check for sql server version
if (select cast(left(cast(serverproperty('productversion') as varchar), 4) as decimal(5, 3))) >= 10 
        CREATE unique nonclustered index ix1_table
            ON table (column1, column2)
            WHERE column1 is not null and column2 is not null
        ELSE
            CREATE nonclustered index ix1_table
                ON table (column1, column2)

Le problème est que toute la déclaration est évaluée et sur SQL Server 2005, cela jette une erreur:

Syntaxe incorrecte près du mot clé 'Où'.

Est-il possible d'en quelque sorte créer un index différent basé sur la version SQL Server?

4
Dragan Matic

Vous pouvez utiliser SQL dynamique

Je veux dire d'abord vérifier la version

Ensuite, construisez votre instruction SQL à l'aide d'une variable de chaîne, par exemple Nvarchar (Max)

Puis exécutez-le par sp_executesql

Je pense que suivre le script peut travailler pour cette tâche

-- check for sql server version
declare @sql nvarchar(max)
if (select cast(left(cast(serverproperty('productversion') as varchar), 4) as decimal(5, 3))) >= 10 

set @sql = N'CREATE unique nonclustered index ix1_table ON [table] (column1, column2)
        WHERE column1 is not null and column2 is not null'

        ELSE

set @sql = N'CREATE nonclustered index ix1_table ON [table] (column1, column2)'


exec sp_executeSQL @sql
6
kodyaz

Comme vous l'avez deviné, le problème de votre approche est la syntaxe de requête, considérée comme invalide si la version SQL Server n'est pas assez élevée, entraînant ainsi la requête entière refusée, même si ce code ne serait effectivement jamais exécuté.

Vous pouvez utiliser la commande 'Execute' (ou 'Exec') pour contourner ce chèque:

IF <Version Check>
    EXECUTE('Index creation command for SQL Server 2008')
ELSE
    EXECUTE('Index creation command for SQL Server 2005')

L'argument à une instruction "exécutée" n'est pas évalué à l'avance préalablement; Il est exécuté tel quel Chaque fois que la déclaration est atteinte (des erreurs potentiellement engagées au moment de l'exécution).

Informations complètes ICI .

4
Massimo

Bien sûr, vous pouvez faire un chèque pour @@ version et faire du code conditionnel en fonction de cela.

If @@VERSION like 'Microsoft SQL Server 2008%' THEN
BEGIN
--'stuff here'
END

Vous pouvez le faire comme une déclaration de cas, mais puisque @@ version renvoie les informations de service de service, il peut fournir à TMI lorsque tout ce que vous voulez, il est de vérifier une fonctionnalité prise en charge.

Bonne chance!

1
Katherine Villyard