Comment gérer les champs textes SQL Server de plus de 8000 caractères sans erreur ? Les champs VARCHAR et NVARCHAR sont limités à 8000 caractères avec SQL Server. Manipuler des champs textes supérieurs à 8000 caractères et le message suivant s’affiche : The text, ntext, and image data types are invalid for local variables.. Voici donc une solution pour contourner cette limitation des 8000 caractères en T-SQL avec SQL Server.
Erreur SQL Server : The text, ntext, and image data types are invalid for local variables.
Premièrement, cette erreur s’affiche si vous avez essayés de déclarer un argument du type TEXT dans une procédure stockée de la manière suivante.
CREATE PROCEDURE MA_PROCEDURE @Variable_Text TEXT AS BEGIN DECLARE @VARIABLE_TEXT TEXT -- Ligne posant problème DECLARE @VARIABLE_VARCHAR VARCHAR(8000) -- Type VARCHAR limité à 8000 caractères -- Suite du CODE SQL de la Procédure stockée -- ETC. END;
Le message d’erreur en Français :
Les types de données text, ntext et image ne sont pas valides pour les variables locales.
Eviter la limite MS SQL à 8000 caractères avec VARCHAR(MAX)
Deuxièmement, Microsoft SQL Server n’autorise pas la syntaxe vue ci-dessus. Dans quelques temps, le type TEXT disparaitra du SGBD de Microsoft. Afin d’éviter ce problème il vous faudra utiliser le type NVARCHAR(MAX). Il donne la possibilité de se stocker des chaînes de longueurs variables. Et ainsi de contenir des chaînes de caractères supérieures à 8000 caractères.
En effet, voici un exemple de code SQL en 3 étapes pour:
- Supprimer la procédure si elle existe.
- Créer la table temporaire.
- Créer la procédure stockée qui utilise le type de données VARCHAR(MAX)
-- 1. Supprimer la procédure stockée si elle existe déjà dans la base SQL Server IF EXISTS ( SELECT name FROM sysobjects WHERE name = 'MA_PROCEDURE' AND type = 'P') DROP PROCEDURE MA_PROCEDURE; GO -- 2. Créer la table cible temporaire à l’aide un champ de type TEXT. CREATE TABLE #TABLE_TEMPORAIRE ( TRES_LONG_CHAMP TEXT ); -- 3. Créer la procédure stockée SQL qui gère les longs champs textes CREATE PROCEDURE MA_PROCEDURE AS BEGIN DECLARE @VARIABLE_VARCHAR VARCHAR(MAX); DECLARE @COMPTEUR INTEGER; SET @VARIABLE_VARCHAR = 'A'; SET @COMPTEUR = 0; PRINT 'TEST ' + @VARIABLE_VARCHAR; WHILE (@COMPTEUR < 10000) BEGIN SET @VARIABLE_VARCHAR = @VARIABLE_VARCHAR + 'A'; SET @COMPTEUR = @COMPTEUR + 1; END PRINT @VARIABLE_VARCHAR; INSERT INTO #TABLE_TEMPORAIRE VALUES (@VARIABLE_VARCHAR); END;
Texte de plus de 8000 caractères dans une colonne de type TEXT
Enfin, cette solution permet de manipuler des champs de texte d’une longueur conséquente. A noter également qu’il est possible d’utiliser un champ de type NVARCHAR(MAX) pour stocker le résultat de la requête.
-- L’exécution de la procédure stockée vu un peu plus haut EXEC MA_PROCEDURE; -- La requête SELECT afin d’effectuer la vérification du résultat SELECT TRES_LONG_CHAMP FROM #TABLE_TEMPORAIRE
Ce code permet donc de textes SQL Server de plus de 8000 caractères pour éviter les erreurs d’incompatibilité des types de données. Pour aller plus loin, il est aussi possible d’utiliser le format SQL Server XML pour transformer du contenu XML en texte avec séparateur.
Soyez le premier à commenter