sp_executesql und strings länger als 8000 Bytes

29/01/2009 - 08:05 von Detlef | Report spam
Hallo,

habe in einer Prozedur einen lokelen String @sql mit mehr als 8000 Bytes und
möchte diesen mit EXEC(@sql) oder mit EXEC sp_executesql @SQL aufrufen.
Aber alles was ich versuche (declare @cSQL nvarchar(max)) immer wieder
scheitere ich an der 8000er Hürde, der Select wird einfach abgeschnitten.
Wie kann ich die Limitierung aufheben, denn eigentlich arbeitet ja
sp_executesql mit ntext.

Im voraus besten Dank

Gruß
Detlef
 

Lesen sie die antworten

#1 Elmar Boye
29/01/2009 - 09:47 | Warnen spam
Hallo Detlef,

Detlef schrieb:
habe in einer Prozedur einen lokelen String @sql mit mehr als 8000 Bytes und
möchte diesen mit EXEC(@sql) oder mit EXEC sp_executesql @SQL aufrufen.
Aber alles was ich versuche (declare @cSQL nvarchar(max)) immer wieder
scheitere ich an der 8000er Hürde, der Select wird einfach abgeschnitten.



Ich kenne Deine Ausdrücke nicht, aber ich vermute Du scheiterst an
der Hürde, das ein Zeichenkettenausdruck nur 8000 Bytes - d. h.
ANSI 8000 Zeichen und bei Unicode 4000 Zeichen - lang sein darf.

Und so ist es ein Unterschied, ob Du schreibst:

DECLARE @sql nvarchar(max)

SET @sql = N'SELECT * FROM dbo.Customers WHERE 0=1;'
+ N'SELECT * FROM dbo.Customers WHERE 0=1;'
+ N'SELECT * FROM dbo.Customers WHERE 0=1;'

SELECT LEN(@sql), DATALENGTH(@sql)

oder aber

DECLARE @sql nvarchar(max)

SET @sql = N'SELECT * FROM dbo.Customers WHERE 0=1;'
SET @sql = @sql + N'SELECT * FROM dbo.Customers WHERE 0=1;'
SET @sql = @sql + N'SELECT * FROM dbo.Customers WHERE 0=1;'

SELECT LEN(@sql), DATALENGTH(@sql)

wobei auch im zweiten Falle gilt, dass der angefügte
Zeichenkettenausdruck nicht lànger als 8000 Bytes sein darf.

Wie kann ich die Limitierung aufheben, denn eigentlich arbeitet ja
sp_executesql mit ntext.



auch EXEC, sp_executesql arbeiten seit SQL Server 2005
mit NVARCHAR(max).

Nur für Zeichenketten gibt es keinen MAX Datentyp
(dafür wàre ein Pràfix wie N' notwendig).
Was oben gezeigt werden sollte:
Begrenze die Teilausdrücke auf die magischen 4000 Zeichen
bei Unicode - was Du für SQL Anweisungen verwendest solltest,
denn so entfàllt die Konvertierung (die bei VARCHAR notwendig
wàre).

Gruß Elmar

Ähnliche fragen