Проблема с неявным преобразованием.
Если у вас есть значения Unicode / nChar / nVarChar, которые вы объединяете, то SQL Server неявно преобразует вашу строку в nVarChar (4000), и, к сожалению, слишком глуп, чтобы понимать, что она будет усекать вашу строку или даже выдает предупреждение о том, что данные были усечены в этом отношении!
При объединении длинных строк (или строк, которые, по вашему мнению, могут быть длинными) всегда предварительно объедините построение строк с CAST ('' как nVarChar (MAX)) примерно так:
SET @Query = CAST('' as nVarChar(MAX))--Force implicit conversion to nVarChar(MAX)
+ 'SELECT...'-- some of the query gets set here
+ '...'-- more query gets added on, etc.
Какая боль и страшно думать, как работает SQL Server. (
Я знаю, что другие обходные пути в Интернете говорят о том, чтобы разбить ваш код на несколько назначений SET / SELECT с использованием нескольких переменных, но это не нужно, учитывая решение, приведенное выше.
Для тех, кто набрал максимум 8000 символов, возможно, потому что у вас не было Unicode, поэтому он был неявно преобразован в VarChar (8000).
Объяснение:
За кулисами происходит то, что, хотя переменная, которую вы назначаете для использования (MAX), SQL Server будет оценивать правую часть значения, которое вы назначаете в первую очередь, и по умолчанию nVarChar (4000) или VarChar (8000) (в зависимости от на что ты конкатенируешь). После того, как это сделано для определения значения (и после усечения его для вас), оно затем преобразует его в (MAX) при присвоении его вашей переменной, но к тому времени уже слишком поздно.