powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
19 сообщений из 19, страница 1 из 1
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #36754738
golol_ol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Моё почтение господа!

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

CREATE PROCEDURE [dbo].[sp_tmp]
as
begin
execute(N'select FNAME1,FNAME2 from TABLENAME1 '
N' where '
N' FNAME3 like ' + '''25%''' +
N' or FNAME3 like ' + '''45%''' +
N' or FNAME3 like ' + '''75%'''
)
end

go


Если эту процедуру запустить на выполнение – она выполнится.
Выполняю процедуру в SQL Advantage : exec sp_tmp

Если процедуру модифицировать и добавить строки, например:
N' or FNAME3 like ' + '''85%''' +
N' or FNAME3 like ' + '''494%''' +
И т.д.

То может произойти так, что длина sql запроса превысит 255 символов, и при выполнении процедуры получим сообщение об ошибке:
Character or binary data returned from Adaptive Server has been truncated.
The client application does not support more than 255 bytes of data as a result column or output parameter.

Помогите решить проблему.
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #36754955
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golol_ol wrote:

> Помогите решить проблему.

А эта проблема не решается в принципе.
Именно поэтому EXEC() -- это ацтой и мастдай.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #36754959
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golol_ol,

ну как вариант (по талантливости подстать смыслу процедуры):

execute(N'select FNAME1,FNAME2 from TABLENAME1 '
N' where '
N' FNAME3 like ' + '''25%''' +
N' or FNAME3 like ' + '''45%''' +
N' or FNAME3 like ' + '''75%'''
)

left(FNAME3,2) in ('25','45','75')


либо занести значения в таблицу и left(FNAME3,2) not in (select ... from #table)
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #36754987
golol_ol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, тот sql запрос который я написал - надуманный.
Просто он наглядный.
Мне необходимо исполнить в хранимой процедуре запрос длиной больше чем 255 символов.
Вот и всё.
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #36755037
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golol_olГоспода, тот sql запрос который я написал - надуманный.
Просто он наглядный.
Мне необходимо исполнить в хранимой процедуре запрос длиной больше чем 255 символов.
Вот и всё.

а так сработает?



Код: plaintext
1.
2.
3.
4.
DECLARE @cmd VARCHAR( 255 )
SELECT @cmd='select '+REPLICATE('1,', 124 )
PRINT @cmd
EXECUTE (@cmd+'1')
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #36755060
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golol_ol,

А с чего вы взяли что будет ошибка?

Если меня не подводят знания анг.языка, то

There are no restrictions to the number of characters supplied with the literal string
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #36755062
golol_ol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конечно нет komrad , ведь
DECLARE @cmd VARCHAR(255)

Это означает, что длина переменной не может быть больше 255 символов.
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #36755082
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golol_olКонечно нет komrad , ведь
DECLARE @cmd VARCHAR(255)

Это означает, что длина переменной не может быть больше 255 символов.

и?
я же предложил склеить внутри экзека
таким образом проверим что ограничение именно на суммарную длину строки внутри execute

у меня к сожалению нет под рукой Sybase ASE для проверки
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #36755144
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golol_ol wrote:
> Автор: "golol_ol"
> Конечно нет *komrad*, ведь
> *DECLARE* @cmd VARCHAR(255)
>
> Это означает, что длина переменной не может быть больше 255 символов.

в 12.5 -- не может быть более 16384 символов.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #36755314
golol_ol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, проверил.
Выводится переменная длиной в 255.
Exec не выполнял, завтра проверю, но шансы не большие.
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #37114513
golol_ol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,
Доброго времени суток, уважаемый MasterZiv.

А, что не отстой?

Если у Вас есть рецепт преодоления проблемы связанной с длиной sql-запроса в хранимой процедуре, то может быть
подскажете как это сделать?
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #37114598
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golol_ol,

рецепта нет, и не только у меня.
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #37114681
golol_ol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Спасибо, дружище!!
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #37114781
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 14.02.2011 12:10, golol_ol wrote:

А ну кстати есть небольшой хак, который делает всё немного легче (но не до конца).

Можно делать так (ограничение -- порядка 16000):
Код: plaintext
1.
2.
3.
declare @sql varchar( 16000 )
select @sql = 'select 1,2,3,4,5, ... 9999, 10000'
exec ( @sql )

А можно делать и так (ограничение больше):
Код: plaintext
1.
exec ( 'select 1,' + '2,' + '3,' + '4,'+ ... +'9999,' + '10000' )

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #37115539
golol_ol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivOn 14.02.2011 12:10, golol_ol wrote:

А ну кстати есть небольшой хак, который делает всё немного легче (но не до конца).

Можно делать так (ограничение -- порядка 16000):
Код: plaintext
1.
2.
3.
declare @sql varchar( 16000 )
select @sql = 'select 1,2,3,4,5, ... 9999, 10000'
exec ( @sql )


а если сделать так:

declare @sql varchar(16000)
select @sql = 'select 1,2,3,4,5, ... 9999, 10000'
select @sql as sql
-- exec ( @sql )

то получим обрезку
sql
---
select 1,2,3,4,5,...

Строка изображённая красным цветом имеет длину 255 символов, т.е автор9999, 10000 просто не войдут.
Вот в чём прискорбный финт.
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #37115905
invariant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golol_ol,

Для ASE12.5 и далее "set stringsize nnnnn" спасает отца русской демократии. Правда, только до 16384 символов.
Кроме того, возможна еще обрезка на клиенте, если он собран со старыми библиотеками, я с таким сталкивался.
Вот такая процедура выдает в isql больше 256 символов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create procedure tstproc
  @cnt int
as
  begin
  set stringsize  16384 
  declare @sql varchar( 16000 )

  declare @i int
  select @sql="select 0"
  select @i= 1 
  while @i<@cnt
    begin
    select @sql=@sql+','+convert(varchar( 5 ),@i)
    select @i=@i+ 1 
    end
  select @sql
  return  0 
  end
go

exec tstproc  500 
go
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #37115910
invariant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golol_ol,

Еще один момент - если этому @sql попробовать exec сделать, IMHO будут проблемы из-за количества колонок в запросе (я не помню, какой там лимит, но он есть).
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #37116510
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 14.02.2011 22:29, invariant wrote:

> Кроме того, возможна еще обрезка на клиенте, если он собран со старыми
> библиотеками, я с таким сталкивался.

Это очень навряд ли.
Если varchar(255) приходит клиенту, он имеет тип
CS_CHAR, а если скажем varchar(257) -- уже тип другой, CS_LONGCHAR.
Так что старое ПО, непеределанное под 12.5 open client, просто
НЕ ПОЛУЧИТ такую колонку.

Правда, это всё относится к супервылизанному Open Client, а
есть ещё куча клиентских библиотек, и ODBC, и JDBC.
Про них ничего не могу сказать, могут и глючить.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
    #37144395
JenyaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invariantgolol_ol,

Для ASE12.5 и далее "set stringsize nnnnn" спасает отца русской демократии. Правда, только до 16384 символов.
Кроме того, возможна еще обрезка на клиенте, если он собран со старыми библиотеками, я с таким сталкивался.
Вот такая процедура выдает в isql больше 256 символов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create procedure tstproc
  @cnt int
as
  begin
  set stringsize  16384 
  declare @sql varchar( 16000 )

  declare @i int
  select @sql="select 0"
  select @i= 1 
  while @i<@cnt
    begin
    select @sql=@sql+','+convert(varchar( 5 ),@i)
    select @i=@i+ 1 
    end
  select @sql
  return  0 
  end
go

exec tstproc  500 
go


set stringsize n

Это не то :

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc32702_1250/html/omni_ug/omni_ug124.htm

@@stringsize indicates the amount of character data to be returned from a toString() method. It is similar in behavior to @@textsize, except it applies only the char data returned by the Java Object.toString() method. The default will value is 50.
The max value is 16384. A value of zero means “use the default.” This value can be modified by a new set command:
set stringsize n
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Ограничение sql запроса (по длине) в процедуре. (Sybase 12.5 Window 2000)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]