Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Какой тип данных?  [new]
marvel
Member

Откуда:
Сообщений: 1066
Выполняю динамический запрос размер которого более 8000 символов.
Есть для этой задачи тип данных?
5 янв 05, 15:03    [1227755]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
есль тока 2 выхода
1 - писать в файл, а потом его исполнять osql/isql(морока)
2 - если не намного более и ограничено, то можно склеивать из нескольких переменных, типа exec(@sql1+@sql2+@sql3)
вот, а спец типа данных нет
5 янв 05, 15:08    [1227776]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
marvel
Member

Откуда:
Сообщений: 1066
Smirnov Anton
есль тока 2 выхода
1 - писать в файл, а потом его исполнять osql/isql(морока)
2 - если не намного более и ограничено, то можно склеивать из нескольких переменных, типа exec(@sql1+@sql2+@sql3)
вот, а спец типа данных нет


Второй вариант мне больше нравиться, но напрашивается вопрос, как мне второй переменной присвоить кусок запроса которые не вместился в первую переменную
5 янв 05, 15:15    [1227800]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Glory
Member

Откуда:
Сообщений: 104760
marvel

Второй вариант мне больше нравиться, но напрашивается вопрос, как мне второй переменной присвоить кусок запроса которые не вместился в первую переменную

Проверять какой длины запрос и разделять на нужное число частей.
5 янв 05, 15:17    [1227804]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
по ситуации
когда это надо было мне - я модифицировал текст ХП
у меня в цикле писалось типа так(на вскидку)
declare @sql varchar(8000),@sql1 varchar(8000),@sql2 varchar(8000)
select @sql='',@sql1 = null,@sql2 = null
while ...
begin
 if len(@sql)>7500 
 begin
  if @sql1 is null
   set @sql1=@sql
  else if @sql2 is null
   set @sql2=@sql
  set @sql=''
 end
 ... 
 set @sql = @sql+....
 ...
end
...
exec(isnull(@sql1,'')+isnull(@sql2,''))
только аккуратнее надо быть с апострофами
5 янв 05, 15:21    [1227812]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
marvel
Member

Откуда:
Сообщений: 1066
мистика какая то

DECLARE
  @sql varchar(8000)

SET @sql = @sql + ','                   + @NEWLINE +
    '  SUM(CASE CAST(' + @oncols +
                     ' AS varchar(100))' + @NEWLINE +
    '        WHEN N''' + @key +
           ''' THEN ' + CASE
                          WHEN @sumcol IS NULL THEN '1'
                          ELSE @sumcol
                        END + @NEWLINE +
    '        ELSE 0'                      + @NEWLINE +
    '      END) as [' + @key + ']'
print (len(@sql))

Выдает 4000, хотя у меня varchar(8000).
5 янв 05, 15:41    [1227862]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
хм, но len вообще должен выдавать заполненную длинну
declare @s varchar(1000)
set @s='1'
print len(@s)
печатает 1
5 янв 05, 15:48    [1227885]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Во-первых len() не учитывает хвостовые пробелы.
Во-вторых, varchar(8000) это _максимально_ 8000 байт. А реально столько, сколько занесено. Т.е. от 0 до 8000
5 янв 05, 15:49    [1227892]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
marvel
Member

Откуда:
Сообщений: 1066
Правильно, но у меня чего то странное происходит:
DECLARE
  @sql varchar(3500)
PRINT выдает 3500, а если ставлю 8000, то он заполняет до 4000.
5 янв 05, 15:51    [1227900]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Glory
Member

Откуда:
Сообщений: 104760
marvel
Правильно, но у меня чего то странное происходит:
DECLARE
  @sql varchar(3500)
PRINT выдает 3500, а если ставлю 8000, то он заполняет до 4000.

Ну так если в varchar(3500) присвоить 4000 байт вся переменная и будет иметь длину 4000. Ибо будет "заполнена" под завязку

А если в varchar(8000) присвоить 4000 байт то реальная длина пременной и будет 4000
5 янв 05, 15:54    [1227904]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
marvel
Member

Откуда:
Сообщений: 1066
Glory

А если в varchar(8000) присвоить 4000 байт то реальная длина пременной и будет 4000


А если в varchar(8000) присвоить 8000 байт то реальная длина пременной тоже будет 4000?
5 янв 05, 15:59    [1227913]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Glory
Member

Откуда:
Сообщений: 104760
declare @var1 varchar(3500), @var2 varchar(8000), @var3 varchar(8000)

set @var1 = replicate('a', 4000)
set @var2 = replicate('a', 4000)
set @var3 = replicate('a', 8000)

select len(@var1), len(@var2), len(@var3)
5 янв 05, 16:02    [1227919]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Beaver
Member

Откуда:
Сообщений: 210
1. Используйте sp_execresultset
2. Запишите динамический запрос в текстовое поле и затем нарезайте
declare @s1 varchar(8000),@s2 varchar(8000),@s3 varchar(8000),@s4 varchar(8000),@s5 varchar(8000) 
create table #ttt (t text)
insert into #ttt values(...)
select @s1=substring(t,1,8000) from #ttt
select @s2=substring(t,8001,8000) from #ttt
select @s3=substring(t,16001,8000) from #ttt
select @s4=substring(t,24001,8000) from #ttt
select @s5=substring(t,36001,8000) from #ttt
exec (@s1+@s2+@s3+@s4+@s5)
drop table #ttt
5 янв 05, 16:08    [1227932]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Простите лаймера, а при @s1+@s2+@s3+@s4+@s5 неприятность не произойдет ?
5 янв 05, 16:27    [1227989]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Beaver
Member

Откуда:
Сообщений: 210
Gluk (Kazan)
Простите лаймера, а при @s1+@s2+@s3+@s4+@s5 неприятность не произойдет ?

А вы проверьте
5 янв 05, 16:38    [1228011]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Gluk (Kazan)
Простите лаймера, а при @s1+@s2+@s3+@s4+@s5 неприятность не произойдет ?

Какие именно неприятности вы имеете ввиду ?
5 янв 05, 16:39    [1228012]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Нет MS SQL под рукой
Переполнение строки например ?
5 янв 05, 16:40    [1228014]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Какой строки ?
Результат конкатенации переменных передается EXEC-у.
Он же не присвается никакой другой переменной и не заносится в столбец
5 янв 05, 16:48    [1228028]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Возможно, это специфика MS SQL. В Oracle я как-то привык, что аргумент передается через переменную
5 янв 05, 16:49    [1228030]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Gluk (Kazan)
Возможно, это специфика MS SQL. В Oracle я как-то привык, что аргумент передается через переменную

В процедуру - да.
Только EXEC() - это не процедура.
5 янв 05, 16:51    [1228033]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Спасибо, понятно
5 янв 05, 16:52    [1228036]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных?  [new]
marvel
Member

Откуда:
Сообщений: 1066
А как записать в текстовый файл?

declare @sql varchar(8000)
set @sql = ' '
WHILE @key IS NOT NULL
BEGIN

  SET @sql = @sql + ','                   + @NEWLINE +
    '  SUM(CASE CAST(' + @oncols +
                     ' AS nvarchar(100))' + @NEWLINE +
    '        WHEN N''' + @key +
           ''' THEN ' + CASE
                          WHEN @sumcol IS NULL THEN '1'
                          ELSE @sumcol
                        END + @NEWLINE +
    '        ELSE 0'                      + @NEWLINE +
    '      END) as [' + @key + ']'

  SELECT @key = MIN(keyvalue) FROM #keys
  WHERE keyvalue > @key
END

EXEC @sql = master..xp_cmdshell  'c:\my.txt'
Чего то у меня не того
5 янв 05, 17:21    [1228093]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить