Gérer les champs SQL Server de plus de 8000 caractères

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. ».

Gérer la limitation des variables texte de plus de 8000 caractères

Voici donc une solution pour contourner cette limitation des 8000 caractères en T-SQL avec SQL Server.

L’erreur SQL Server en Anglais : 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 ».

La solution pour éviter la limitation SQL Server à 8000 caractères est le type 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:

  1. Supprimer la procédure si elle existe.
  2. Créer la table temporaire.
  3. 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;

 Stocker un champs de plus de 8000 caractères dans une colonne de type TEXT

-- 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

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.

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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.


*