sql - превышение размера переменной в exec? - PullRequest
2 голосов
/ 18 января 2011

Я унаследовал некоторый частично полный SQL-код, который я не могу заставить работать.

он обращается к нескольким базам данных, поэтому сначала ищет нужную базу данных, используя номер ID пользователя, а затем вставляет это имя базы данных в запрос. часть, с которой у меня возникла проблема (очень сокращенно), ...

DECLARE @sql AS VARCHAR(8000)  
    SET @sql = 'INSERT INTO ['+@DatabaseName+'].dbo.[customer]  
                  ( -- containing about 200 columns. )  
                VALUES(...)'  
PRINT @sql  
EXEC(@sql)

Я получаю ошибки в середине имени столбца, иногда говоря, что он ожидает скобки или кавычки. я начал удалять пробелы, чтобы, например, [имя], [фамилия] находились в одной строке, а не в двух разных, и это помогло бы мне продвинуться немного дальше по запросу. У меня не так много пробелов, которые я могу удалить, и я только попадаю в часть значений (...). странная вещь я копирую и вставляю только часть столбцов и помещаю ее в Word, и получается всего около 3000 символов, включая пробел.

я что-то упустил?
если это что-то значит, я использую Microsoft SQL Server 2005 и использую студию управления сервером SQL для редактирования

спасибо!

Ответы [ 3 ]

4 голосов
/ 18 января 2011

См. Здесь: SQL Server: когда 8000 символов недостаточно для пары решений

1 голос
/ 19 января 2011

чрезвычайно сокращенно

Ну, это не очень помогает, так как вы, вероятно, сократили причину проблемы.

ЕслиЯ должен был догадаться, я видел случаи, когда были задействованы переменные / столбцы 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)
0 голосов
/ 18 января 2011

Используйте тип данных nvarchar (max) для @ sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...