Проблема заключается в неявном преобразовании.
Если у вас есть значения Unicode / nChar / nVarChar, которые вы объединяете, то SQL Server неявно преобразует вашу строку в VarChar (8000), и, к сожалению, он слишком глупПоймите, что это урежет вашу строку или даже даст вам предупреждение, что данные были урезаны по этому вопросу!
При объединении длинных строк (или строк, которые, по вашему мнению, могут быть длинными) всегда предварительно объединить строение строк с помощью 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, используя несколько переменных, но это не нужно, учитывая решение, приведенное выше.
Для тех, кто достиг максимума в 4000 символов, это, вероятно, было связано с тем, что у вас был Unicode, поэтому он был неявно преобразован в nVarChar (4000).
Объяснение:
Что происходит за кулисами, так это то, что, хотяПри использовании переменной (MAX), которую вы назначаете, SQL Server оценивает правую часть значения, которое вы назначаете первым, и по умолчанию присваивает nVarChar (4000) или VarChar (8000) (в зависимости от того, что вы объединяете).После определения значения (и после его усечения) оно преобразуется в (MAX) при назначении переменной, но к тому времени уже слишком поздно.