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?
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
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 .
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!