T-SQL de type VARCHAR(MAX) Tronquée
DECLARE @str VARCHAR (MAX);
SELECT @str = COALESCE(@str + CHAR(10), '') +
'EXECUTE CreateDeno ' + CAST(ID AS VARCHAR)
FROM GL_To_Batch_Details
WHERE TYPE = 'C' AND
Deno_ID IS NULL;
--PRINT @str;--SELECT @str;
**EXEC(@str);**
ÉDITÉ
Ne EXECUTE
instruction truncate chaînes à 8 000 caractères comme PRINT
? Comment puis-je exécuter une instruction SQL dynamique ayant plus de 8 000 caractères?
Toute suggestion serait chaudement apprécié.
Je pense que vous êtes confus, vous ne pouvez pas
J'ai édité la question pour être plus précis sur le problème. En fait, quand EXÉCUTER produite l'erreur, j'ai utilisé l'IMPRESSION de voir quelle a été la dynamique de T-SQL généré. Dans les deux cas, nvarchar(MAX) a été tronqué. Des idées?
PRINT
plus de 8000 caractères, cela ne signifie pas que @str est tronquéJ'ai édité la question pour être plus précis sur le problème. En fait, quand EXÉCUTER produite l'erreur, j'ai utilisé l'IMPRESSION de voir quelle a été la dynamique de T-SQL généré. Dans les deux cas, nvarchar(MAX) a été tronqué. Des idées?
OriginalL'auteur Nick Binnet | 2011-09-12
Vous devez vous connecter pour publier un commentaire.
PRINT
est limitée à 8k en sortie.Il y a aussi un 8k limite dans SSMS volet des résultats.
Aller à
outils -> options -> query résultats
pour voir les options.
Pour vérifier la longueur des données réelles, vérifier:
SELECT LEN(@str)
Bennet: MSDN dit: Dans les versions antérieures de SQL Server, les chaînes de caractères sont limitées à 8 000 octets. Cela nécessite de concaténer des chaînes pour l'exécution dynamique. Dans SQL Server 2005, varchar(max) et de type nvarchar(max) types de données peuvent être spécifiées afin de permettre les chaînes de caractères à être jusqu'à 2 gigaoctets de données.
J'ai eu à utiliser de type NVARCHAR(MAX) type de données avec sp_executesql afin de le faire fonctionner. Pourriez-vous s'il vous plaît confirmer la même chose peut être réalisé sans l'aide de sp_executesql? Merci.
OriginalL'auteur JNK
Lors de la concaténation de chaînes de caractères et le résultat est de type VARCHAR(MAX) et est de plus de 8000 caractères, au moins un paramètre et/ou de l'élément utilisé dans la concaténation doivent être de type VARCHAR(MAX) type sinon la troncature se fera dans la chaîne résultante et ne sera pas exécutable dans une instruction EXEC.
Exemple:
Plus d'informations sur MSDN.
OriginalL'auteur WayneJohn
La longueur par défaut d'un
varchar
est de 30 caractères:Est-il possible que
id
est de plus de 30 caractères?C'est une bonne pratique de ne jamais utiliser de la longueur par défaut, il y a d'autres fois où la valeur par défaut len est 1.
OriginalL'auteur Andomar
La
PRINT
de commande est certainement limitée à 8000 caractères, indépendamment de la durée de la sortie (ou si elle est de type varchar(max)). Pour contourner cela, vous avez besoin à la sortie de la chaîne dans des morceaux de<8000
caractèresMise à jour: En réponse à votre modifier, exec ne limite pas la longueur de la chaîne. J'ai mis en place l'exemple suivant pour afficher ce:
L'exécution de cette commande affiche la longueur de la 34892 caractères, et tous à l'an 2000 exécuter des instructions faire exécuter (attention, cela peut prendre quelques minutes!)
OriginalL'auteur Jon Egerton
Il se passe quand vous concaténer les littéraux si on n'est pas un type varchar(max), le résultat mal-être "implicite coulé" varchar(8000).
Pour générer un littéral de type varchar(max) toutes les pièces doivent être de type varchar(max).
Remarque: Il m'est arrivé de faire des mises à jour sur les colonnes varchar(max), jamais testé avec la commande EXEC.
Également comme indiqué dans les précédents répond à la commande d'impression est titulaire d'une limite, mais vous pouvez essayer de sélectionner la variable au lieu de l'imprimer. (également ther est une limite que choisir la longueur que vous pouvez configurer sur MS-SMS)
OriginalL'auteur jean
Je voulais aussi voir ce que j'ai été l'envoi d'Exec, et a été confondu par la limite de tirage. Dû écrire un proc à imprimer en morceaux.
OriginalL'auteur Darrel Lee