Submitted by st on
Comment développer un script Transact SQL compatible avec les différentes versions de MS SQL Server ?
Quelques règles simples :
- Utiliser SERVERPROPERTY pour déterminer la version de SQL Server
- Utiliser les procédures stockées système au lieu des instructions TSQL si possible. Par exemple, sp_addlogin au lieu de CREATE LOGIN.
- Exécuter le code TSQL non-compatible comme SQL dynamique
- 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