Add new comment

Développer un script SQL compatible

Comment développer un script Transact SQL compatible avec les différentes versions de MS SQL Server ?

Quelques règles simples :

  1. Utiliser SERVERPROPERTY pour déterminer la version de SQL Server
  2. Utiliser les procédures stockées système au lieu des instructions TSQL si possible. Par exemple, sp_addlogin au lieu de CREATE LOGIN.
  3. Exécuter le code TSQL non-compatible comme SQL dynamique
  4. N'utiliser pas le séparateur ";"

Un exemple de l'expression retournée le numéro majeur de la version :

SELECT 
  substring(convert(sysname, SERVERPROPERTY('ProductVersion')), 
    1, 
    charindex('.', convert(sysname, SERVERPROPERTY('ProductVersion'))) - 1)

Cette expression retourne "10" pour SQL Server 2008, "9" pour SQL Server 2005 et "8" pour SQL Server 2000. Dans la généralité de cas ce sera suffisante. A ma connaissance, SQL Server 7 support aussi SERVERPROPERTY, mais SQL Server 6.x vous amène d'analyser la variable @@version, utiliser le type "varchar" et l'instruction EXEC au lieu de sp_executesql.

Un exemple d'utilisation :

DECLARE @SQLCodeFor2008 nvarchar(4000) -- SQL 2000 ne supporte pas navrchar(MAX)
DECLARE @SQLVersion sysname
SELECT @SQLVersion = substring(convert(sysname, SERVERPROPERTY('ProductVersion')), 1,
   charindex('.', convert(sysname, SERVERPROPERTY('ProductVersion'))) - 1)
IF @SQLVersion = '10' 
BEGIN
   -- Code TSQL compatible mais spécifique pour 2008
   ...
   -- Code TSQL non-compatible et spécifique pour 2008
   EXEC sp_executesql @SQLCodeFor2008
END
ELSE IF @SQLVersion = '9' 
BEGIN
   -- Code TSQL compatible mais spécifique pour 2005
   ...
   -- Code TSQL non-compatible et spécifique pour 2005
   EXEC sp_executesql @SQLCodeFor2005
END
ELSE IF @SQLVersion = '8' 
BEGIN
   -- Code TSQL compatible mais spécifique pour 2000
   ...
   -- Code TSQL non-compatible et spécifique pour 2000
   EXEC sp_executesql @SQLCodeFor2000
END
ELSE
   RAISERROR('SQL Server version is not supported: %s', 11, 1, @SQLVersion)
GO