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




Eviter la limitation à 8000 caractères des variables TEXT en T-SQL ? 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 une solution pour éviter la limitation des 8000 caractères en T-SQL avec SQL Server.

Eviter l’erreur SQL Server « The text, ntext, and image data types are invalid for local variables. »

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_PROCEDIURE
@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;

Solution pour éviter la limitation à 8000 caractères est le type VARCHAR(MAX)

La syntaxe vue ci-dessus n’est pas autorisée par Microsoft SQL Server. 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) qui donne la possibilité de se stocker des chaînes de longueurs variables et de contenir des chaînes supérieures à 8000 caractères.

-- Ce code supprime la procédure stockée si elle existe.
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'MA_PROCEDURE' AND type = 'P')
DROP PROCEDURE MA_PROCEDURE
GO

-- La création de la table cible temporaire à l’aide un champ de type TEXT.
CREATE TABLE #TABLE_TEMPORAIRE (
TRES_LONG_CHAMP TEXT
);

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

Cette solution permet de manipuler des champs de texte d’une longueur conséquente. Il est intéressant de noter également que nous aurions pu stocké le résultat de la requête dans un champ de type VARCHAR(MAX).