2016-05-21 3 views
0

Je dois créer une requête SQL dynamique dans SP. la requête dynamique est de 5000 caractères, et j'utilisé NVARCHAR (MAX), VARCHAR (MAX), NVARCHAR (6000), VARCHAR (6000), mais ils ont tous tronquer à 4000 caractèresne peut pas stocker 5000 caractères dans NVARCHAR et VARCHAR

DECLARE @SCRIPT VARCHAR(8000) 
set @SCRIPT =' ASDADASD ASDA DSADAD AD AS D......' [email protected]+ ' AWDAWd' -- 6000 CHARS 
PRINT LEN(@SCRIPT)  -- THIS PRINTS "4000" 
PRINT @SCRIPT   -- THIS PRINTS ONLY 4000 CHARS 

Comment augmenter la taille de STRING ? J'ai lu beaucoup de post mais je ne pourrais pas le faire. Aidez-moi, s'il vous plaît?

+0

Je soupçonne que le panneton qui est mssing de votre question est que ce n'est pas un pur 6000 caractère * littéral *, mais vous avez la construire à partir de plusieurs * littéraux séparés * et tomber sous le coup de [troncature] (https://msdn.microsoft.com/en-us/library/system.reflection.emit.ilgenerator(v=vs.110).aspx): "Si le résultat de la concaténation des chaînes dépasse la limite de 8 000 octets, le résultat est tronqué.Toutefois, si au moins l'une des chaînes concaténées est un type de grande valeur, la troncature ne se produit pas. " –

Répondre

2

Utilisez plutôt le type de données nvarchar(max). Assurez-vous de préfixer les littéraux de chaîne avec l'indicateur N (N' ASDADASD...'). Cast explicitement que la limitation par défaut ne sera pas applicable:

set @script=convert(nvarchar(max),N'very-long-literal') 

(référence: The weird length of varchar and nvarchar in T-SQL)

EDIT: complet exemple de travail:

DECLARE @SCRIPT nvarchar(max) 
SET @SCRIPT=convert(nvarchar(max),N' ASDADASD ASDA DSADAD AD AS D......')+replicate(convert(nvarchar(max),N'A'),6000) 
PRINT LEN(@SCRIPT) -- this prints "6036" 
PRINT @SCRIPT -- this prints all 6036 chars of the string 
+0

cela n'a pas fonctionné .. –

+0

@ayilmaz J'ai mis à jour ma réponse avec un échantillon complet de code fonctionnant. Quelle version du serveur SQL utilisez-vous? mon test réussi a été fait sur un 10.50.1617. – dlatikay

+0

mais dans la fonction de réplication, que dois-je donner au lieu de 'A' –

0

De MSDN

-longueur variable , données de chaîne non-Unicode. n définit la longueur de la chaîne et peut être une valeur comprise entre 1 et 8 000. max indique que la taille de stockage maximale est de 2^31-1 octets (2 Go). La taille de stockage est la longueur réelle des données entrées + 2 octets. Les synonymes ISO pour varchar sont char variant ou caractère variable.

Il suffit donc de spécifier une taille de (max)

+0

nvarchar (max) ne fonctionne pas non plus –

1

NVARCHAR (n) est limitée à 4000, VARCHAR + NVARCHAR = NVARCHAR. Regardez

DECLARE @SCRIPT VARCHAR(8000) 
set @SCRIPT = replicate('A',6000)+'A' 
select len(@SCRIPT) 

set @SCRIPT = replicate('A',6000)+N'A' 
select len(@SCRIPT), 'mind NVARCHAR' 

Tout jeter NVARCHAR (MAX) pour être sûr.

DECLARE @SCRIPT NVARCHAR(MAX) =replicate('A',7000) 
set @SCRIPT = @SCRIPT +'A' 
select len(@SCRIPT) 

set @SCRIPT = @SCRIPT + cast(replicate('A',6000) as NVARCHAR(MAX)) 
select len(@SCRIPT) 
+0

Bonjour, le premier ressemble à travailler mais quand j'ai mis mon script à @SCRIPT. Il tronque à nouveau à 4000 –

+0

@ayilmaz voir éditer – Serg

+0

votre exemple fonctionne mais le mien ne marche pas. J'ai oublié de mentionner qu'il existe des variables CONCATed au milieu du NVARCHAR. Cela peut-il causer un problème? J'ai édité mon code ci-dessus –