Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
abort
Member

Откуда:
Сообщений: 625
Пишу динамический SQL, объявляю переменную @sql VARCHAR(8000). Присваиваю строку с длино 4600 символов, но он урезает до 4000 символов. Приходится разбивать на две переменные @sql_1 и @sql_2 и сцеплять их потом. И что самое интересное
SET @sql = @sql_1 + @sql_2 

в переменную @sql записывается реально 4600 символов. А напрямую присваивание @sql - происходит обрезание строки
В чем фокус?
22 апр 15, 06:51    [17546683]     Ответить | Цитировать Сообщить модератору
 Re: почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
Добрый Э - Эх
Guest
abort,

размерность измеряется не в символах, а в байтах. если кодировка двухбайтовая, то в 8000 байт в аккурат влезет 4000 двухбайтовых символов.
22 апр 15, 07:03    [17546696]     Ответить | Цитировать Сообщить модератору
 Re: почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
abort
Member

Откуда:
Сообщений: 625
символы все однобайтовые англицкие слова, никаких юникодовых символов
22 апр 15, 07:19    [17546719]     Ответить | Цитировать Сообщить модератору
 Re: почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
Glory
Member

Откуда:
Сообщений: 104751
abort
В чем фокус?

В том, что кто-то написал неправильный код, но уверен, что он правильный

declare @sql varchar(8000)
set @sql = replicate('-', 4600)
select len(@sql)
22 апр 15, 09:19    [17547009]     Ответить | Цитировать Сообщить модератору
 Re: почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
А вообще говоря, и EXEC(@sql) и EXEC sp_executesql @sql всё равно неявно преобразуют аргумент к типу NVARCHAR(MAX).
Если MSSQL >= 2005, конечно.
22 апр 15, 09:30    [17547050]     Ответить | Цитировать Сообщить модератору
 Re: почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
o-o
Guest
abort,

проверьте, нет ли у вас в склеиваемой строке подстроки типа NVARCHAR.
например, это ф-ции, возвращающие SYSNAME (sysname = nvarchar(128)):
declare @sql varchar(8000);
set @sql = replicate('-', 4600);
select len(@sql);
---
4600

set @sql = db_name() + replicate('-', 4600);
select len(@sql);
---
4000

set @sql = @sql + 'qqq';
select len(@sql);
---
4003
22 апр 15, 10:01    [17547253]     Ответить | Цитировать Сообщить модератору
 Re: почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
o-o,

проще не проверять, а просто создать @sql сразу с типом NVARCHAR(MAX).
При этом не забывая про применение буквы N перед литеральными юникодными строками.
22 апр 15, 10:04    [17547268]     Ответить | Цитировать Сообщить модератору
 Re: почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
o-o
Guest
iap,

конечно проще.
но у ТС вопрос "почему", а у меня ответ "возможно, потому, что..."
22 апр 15, 10:06    [17547279]     Ответить | Цитировать Сообщить модератору
 Re: почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9159
Чудес не бывает, ищите юникод в конкатенации.
22 апр 15, 12:50    [17548192]     Ответить | Цитировать Сообщить модератору
 Re: почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
developer911
Member

Откуда:
Сообщений: 1
у вас скорее всего проблема в том, что переменную то вы объявили длиной 8000, но вероятно есть и еще одна переменная, которая длиной всего 4000 или сколько там..
иными словами 8000 нельзя передать все в переменную меньшего размера...
Ищите свой баг и начните с поиска 4000
Полезная ссылка
22 апр 15, 15:39    [17549521]     Ответить | Цитировать Сообщить модератору
 Re: почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
abort
символы все однобайтовые англицкие слова, никаких юникодовых символов


И нет юникодных констант N'jkljnlk'?
22 апр 15, 16:07    [17549692]     Ответить | Цитировать Сообщить модератору
 Re: почему переменная с типом VARCHAR(8000) реально использует меньше символов  [new]
abort
Member

Откуда:
Сообщений: 625
нашел таки юникодовую штучку в функции. Так что всем спсб. А вот nvarchar(max) это идея
22 апр 15, 19:33    [17550797]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить