чрезвычайно сокращенно
Ну, это не очень помогает, так как вы, вероятно, сократили причину проблемы.
ЕслиЯ должен был догадаться, я видел случаи, когда были задействованы переменные / столбцы NCHAR или CHAR.Они расширяются до полной длины при использовании в конкатенации строк, и это приведет к тому, что конечный оператор будет слишком длинным.
Для того, что стоит для стиля или иным образом, всегда используйте NVarchar (Max) для SQL Server 2005 и далее,Фактически, это ожидаемый тип, если вы используете sp_executesql.
Если вы проверите столбцы N / CHAR фиксированной ширины и переключитесь на nvarchar (max), вы можете увидеть, что проблема исчезла.
EDIT : тест, показывающий, что NVarchar (Max) держит лунку, превышающую 8000 байт.
declare @sql nvarchar(max)
-- this CTE sets up the columns, 1 as field1, 2 as field2 etc
-- it creates 2000 columns
;with CTE(n, t) AS (
select 1, convert(nvarchar(max),'1 as field1')
union all
select n+1, convert(nvarchar(max),RIGHT(n, 12) + ' as field'+RIGHT(n, 12))
from cte
where N < 2000)
select @sql = coalesce(@sql+',','') + t
from CTE
option (maxrecursion 2000) -- needed, the default of 100 is not nearly enough
-- add the SELECT bit to make a proper SQL statement
set @sql = 'select ' + @sql
-- check the length : 33786
select LEN(@sql)
-- check the content
print @sql
-- execute to get the columns
exec (@sql)