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

Откуда: Фром Москоу
Сообщений: 3939
Привет!

declare @sql AS varchar(8000)

set @sql='Select ...'
exec (@sql)


Но переменная @sql должна содержать больше 8000 символов.
Отсюда - ошибки.

Подскажите плиз - как это обойти?

Спасибо.

===============================
Qper
10 ноя 03, 16:07    [411400]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Lexis
Member

Откуда: Moscow
Сообщений: 1737
тип TEXT катит?

May the Force be with you
10 ноя 03, 16:11    [411418]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Glory
Member

Откуда:
Сообщений: 104760
declare @sql1 AS varchar(8000), @sql2 AS varchar(8000), @sql3 AS varchar(8000) ...

set @sql1='Select ...'
set @sql2=' ...'
set @sql3='...'
...
exec (@sql1+@sql2+@sql3 + ....)
10 ноя 03, 16:14    [411426]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А так не прокатит?

declare @sql0 AS varchar(8000)

declare @sql1 AS varchar(8000)
declare @sql2 AS varchar(8000)
...
set @sql0='Select ...'
set @sql1='...'
set @sql2='...'
...
exec (@sql0+@sql1@sql2...)
10 ноя 03, 16:14    [411428]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
Спасибо


ps
2 Lexis
Вроде переменную типа text создать нельзя.
10 ноя 03, 17:00    [411515]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
TUnknown
Guest
Это раньше пролетало в форуме и придумано не мной

exec xp_execresultset
N'select ''alter procedure dbo.example as select 1''',N'TestDb'
10 ноя 03, 17:01    [411519]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Lexis
Member

Откуда: Moscow
Сообщений: 1737
Private Sub Publictate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Publictate.Click

Dim EventConn As SqlClient.SqlConnection = New SqlClient.SqlConnection("Data Source=CROWD;Integrated Security=SSPI;Initial Catalog=Speed;")
Dim sqlCommand As SqlClient.SqlCommand = New SqlClient.SqlCommand("insert into EventsBody(EvetnBody) values ( @BlobValue)", EventConn)
Dim sqlReader As SqlClient.SqlDataReader
Dim sNewsBody As String
sqlCommand.Parameters.Add(New SqlClient.SqlParameter("@BlobValue", SqlDbType.Text))
sqlCommand.Parameters("@BlobValue").Value = sNewsBody
EventConn.Open()
sqlCommand.ExecuteNonQuery()
EventConn.Close()
End Sub


у меня Insert вот так примерно работает
Select, думаю, можно так же построить
10 ноя 03, 23:15    [411834]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
:(((
А можно как-нибудь по-другому, не так exec (@sql1+@sql2+@sql3 + ....)

Я же не знаю какого она будет размера :(((
Как-то криво получается. Заранее объявить много переменных. Так не нравится. А что, если опять не поместится. Может есть другой вариант?

2 TUnknown

Я не понял. Что это такое. :(( Можно поподробнее? И как этим пользоваться?

2 Lexis

Не соображу пока...
11 ноя 03, 17:20    [413287]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Tracer
Member

Откуда:
Сообщений: 728
А может просто выполнить отдельную сгенерированную SQL команду ? Или обязательно нужно через stored procedure ?
11 ноя 03, 18:17    [413401]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
Задача - выполнить запрос, текст которого динамически формируется в хп и может достигать нескольких десятков тысяч символов (на практике в среднем от 10000 до 50000).

Плюс к тому же обнаружились еще какие-то глюки при склейке строк, которым я пока объяснения найти не могу. Чуть попозже спрошу. Попробую пока сам справиться :((
11 ноя 03, 18:41    [413453]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
А зачем такие большие запросы? Сколько времени он будет компилироваться? Сколько времени выполняться?
11 ноя 03, 18:45    [413454]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
2 злой шаман

Сейчас выполняется за 2-3 сек при запросе в <8000 символов . (Данных не много.)

PS Если интересно - это перекресные запросы

===============================
Qper
11 ноя 03, 18:52    [413463]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
Кросстабы что ли? Делай лучше через временную табличку. Потом проблем будет меньше.

create table #t ([Код] int)

while 1=1 begin
exec('alter table #t add column c1 int')
exec('update #t set c1=blablabla')
end
select * from #t
drop table #t
11 ноя 03, 19:13    [413505]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
С этим у меня проблем нету.

Вопрос в сабже.
А вот так:
declare @sql1 AS varchar(8000), @sql2 AS varchar(8000), @sql3 AS varchar(8000) ...

set @sql1='Select ...'
set @sql2=' ...'
set @sql3='...'
...
exec (@sql1+@sql2+@sql3 + ....)

Почему-то не получается. Может такое быть? Или у меня руки кривые?


===============================
Qper
11 ноя 03, 19:32    [413528]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
Дурная голова рукам покоя не дает. Дерзайте дальше, молодой человек, в этом топике достаточно информации чтобы решить вашу проблему.
11 ноя 03, 19:50    [413542]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
Ничего не понимаю!!!
Пишу:
exec(@sql1+@sql2)

А выполняется только часть @sql1. Вторая переменная не приклеивается. сейчас сойду с ума!!!

===============================
Qper
11 ноя 03, 19:55    [413548]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
А так прокатывает:

exec(@sql+"ла-ла-ла")

Может кто знает - почему?

===============================
Qper
11 ноя 03, 20:00    [413552]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Glory
Member

Откуда:
Сообщений: 104760
А выполняется только часть @sql1. Вторая переменная не приклеивается. сейчас сойду с ума!!!

Сделайnt для начала

print @sql1+@sql2
11 ноя 03, 21:03    [413619]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
2 Glory

Ну как такое может быть?:
Так работает:

declare @sql1 varchar(8000)

declare @sql2 varchar(8000)
set @sql1="select name1 "
set @sql1=",name2"
exec (@sql1+@sql2+" from Table")


А так не работает (выводит только name1)
declare @sql1 varchar(8000)

declare @sql2 varchar(8000)
set @sql1="select name1 "
set @sql2=",name2"
exec (@sql1+@sql2+" from Table")


Даже нет никаких предположений :(((

===============================
Qper
11 ноя 03, 23:51    [413709]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Glory
Member

Откуда:
Сообщений: 104760
Что показывает print @sql1+@sql2 ???
12 ноя 03, 10:15    [413936]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
2 Glory

После долгих проб и ошибок удалось вот что обнаружить:

Так не работает (то есть выводит только name1):
declare @sql1 varchar(8000)

declare @sql2 varchar(8000)
set @sql1="select name1 "
set @sql2=",name2"
exec (@sql1+@sql2+" from Table")


А вот так работает (выводит name1 и name2)
declare @sql1 varchar(8000)

declare @sql2 varchar(8000)
set @sql2=" "---------------------------!!!

set @sql1="select name1 "
set @sql1=",name2"
exec (@sql1+@sql2+" from Table")


Почему это происходит - я не знаю (только догадываюсь). Наверное этому есть какое-то объяснение.

===============================
Qper
13 ноя 03, 01:10    [415603]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Glory
Member

Откуда:
Сообщений: 104760
Cooper, проверь на всякий случай еще раз как ты инициализируешь свои переменные. Потому что
- в предложенных тобой скриптах
имееются разночтения именно в инициализации @sql1 и @sql2 (в каждом скрипте по-своему)
- приведеный ниже скрипт у меня работает

use pubs

go
declare @sql1 varchar(8000)
declare @sql2 varchar(8000)
set @sql1='select au_fname '
set @sql2=', au_lname'
exec (@sql1+@sql2+' from authors')


ЗЫ
И прежде чем выполнять запрос ну выведи себе на экран свои переменные. Не надо склаывать их в уме - это сервер и так за тебя сделает.
13 ноя 03, 11:00    [415991]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
Cooper
Member

Откуда: Фром Москоу
Сообщений: 3939
2 Glory

Опечатался!
На самом деле так:

Так не работает (то есть выводит только name1):
declare @sql1 varchar(8000)

declare @sql2 varchar(8000)
set @sql1="select name1 "
set @sql2=",name2"
exec (@sql1+@sql2+" from Table")




А вот так работает (выводит name1 и name2)
declare @sql1 varchar(8000)

declare @sql2 varchar(8000)
set @sql2=" "---------------------------!!!

set @sql1="select name1 "
set @sql2=",name2"
exec (@sql1+@sql2+" from Table")


Разница только в том, что во втором скрипте написал set @sql2=" "

На экран выводил.
В первом скрипте получилось:
"select name1 from Table"
Во втором скрипте:
"select name1, name2 from Table"

===============================
Qper
13 ноя 03, 11:48    [416144]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
pima
Member

Откуда: Москва
Сообщений: 496
Дык вроде так и должно быть. Тут в недавнем номере RSDN попалась статья про BLOB'ы, вроде там написано, что такая склейка как раз ничего и не даст - результат обрежется до максимально возможных 8000 (если меня не глючит, конечно...). Скрипт с set @sql2=" " проверяли на реальных 8000 символов, а не на 'select name1'? А то может и не пойдет.
Как насчет в сторону BLOBов покопать?
13 ноя 03, 12:54    [416364]     Ответить | Цитировать Сообщить модератору
 Re: Переменная типа varchar(8000). А если нужно больше???  [new]
TUnknown
Guest
элементы скрипта присваиваются не переменной варчар(8000), а пишутся в таблицу
tbl (Id int,cmd varchar(8000))

а после этого выполняется
exec master..xp_execresultset 'select cmd from tbl order by id'

можно посмотреть, как эта процедура выглядит внутри и всё сразу станет понятно

минусы:
1 меньше производительность из-за записи в таблицу
2 надо менять логику, ибо exec() можно собрать из одних и тех же переменных параллельно, а в таблицу можно записать только последовательно

плюсы:
1 ограничение размера скрипта около 1 мега, т.е. недостижимо:-)))
2 не надо писать логику на проверку сборки nulls
2 можно шарить между процедурами собранные скрипты

PS и не надо забывать о SQL injection:-)
13 ноя 03, 15:16    [416783]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить