2015-04-28 4 views
4

Может кто-то пожалуйста, объясните, почему это происходит на SQL Server 2008:SQL Server 2008 NVARCHAR (Max) конкатенация - вопрос Усечение

declare @sql Nvarchar(max); 

set @sql =N''; 

select @sql = @sql +replicate('a',4000) + replicate('b', 6000); 

select len(@sql) 

возвратов: 8000

Несколько сайтов предполагают, что до тех пор, как первой переменной имеет тип NVARCHAR (MAX), усечение не должно происходить, но оно все еще выполняется.

+0

от Google вы получите «поле Varchar (Max), отсекающее данные после 8000 символов SQL Server 2008. У меня есть поле для хранения некоторых данных, поле объявлено как varchar (Max). Насколько я понимаю, это должно хранить 2^31 - 1 символ, но когда я ввожу некоторый контент более 8000 символов, он отсекает остальную часть « – Mukus

+1

Это может помочь: http://dba.stackexchange.com/questions/18483/varcharmax-field-cutting-off-data-after-8000 -characters-sql-server-2008 –

ответ

4

Поскольку 'a' и 'b' не типа NVARCHAR(MAX)

Подобно этому, он должен работать:

declare @sql Nvarchar(max), 
    @a nvarchar(max), 
    @b nvarchar(max); 

select @sql =N'', @a = N'a', @b = N'b'; 

select @sql = @sql +replicate(@a,4000) + replicate(@b, 6000); 

select len(@sql) 

Это ссылка на информацию функции REPLICATE от Microsoft: https://msdn.microsoft.com/en-us/library/ms174383.aspx

Там, в нем говорится:

Если string_expression не имеет тип varchar (max) или nvarchar (max), REPLICATE урезает возвращаемое значение в 8000 байт. Чтобы вернуть значения, превышающие 8000 байт, выражение string_expression должно быть явно передано соответствующему типу данных большого значения.

+0

В моем примере оба REPLICATE возвращают строки, которые ar e менее 8000 байтов, поэтому не должно быть проблем с усечением, происходящим внутри самого репликации. Означает ли это, что если я конкатенирую 100 + строк в T-SQL для построения окончательной динамической строки SQL NVARCHAR (MAX), все 100+ строк должны быть переданы в NVARCHAR (MAX), чтобы избежать проблемы с усечением 8000+? –

+0

@DavidG, добавлено. – ps2goat

+0

Upvote для вас тогда :) – DavidG

1

Что касается причин, я не знаю. Я просто знаю, NVARCHAR любит отрезать на 8000, если вы не отбрасывают вещи NVARCHAR (MAX), или вы можете использовать CONCAT():

DECLARE @sql Nvarchar(max); 

SELECT @sql = CONCAT(@sql,replicate('a',4000),replicate('b', 6000)) --do it this way 

--SELECT @sql = CAST(replicate('a',4000) AS NVARCHAR(MAX)) + CAST(replicate('b', 6000) AS NVARCHAR(MAX)) --or this way 

Оба результата в LEN (@sql) от 10000

+0

-1 потому что 'nvarchar' ограничен 4000 без' max' для размера. 'varchar' ограничен 8000 без' max'. +1 для подхода 'concat', но также работает листинг реплицированных строк:' replicate (cast ('a' как nvarchar (max)), 4000) + replicate (cast ('b' as nvarchar (max)), 6000) '. ОП мог выбрать, какой маршрут лучше всего работает в данный момент. – ps2goat

+0

ссылка на размер nvarchar: https: // msdn.microsoft.com/en-us/library/ms186939.aspx – ps2goat

+0

Если в SQL Server 2008 был доступен только CONCAT ... –

Смежные вопросы