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

Откуда:
Сообщений: 52
Если внешнее приложение (написанное на делфе) которое вызывает хранимую процедуру для заполнения клиентдатасета (результат сортировки, отбора и.т.д).
Проблема заключается в том, что надо результат выполнения первой хранимой процедуры (хп) передать во вторую хп (то есть строить отчеты по отобранным данным).
Пробовал сделать через временную таблицу (tempdb..#result) но вторая хп ее не "видит" :(
Как решить задую проблему?
Заранее спасибо!
18 июн 09, 21:45    [7317931]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
ITW,

https://www.sql.ru/faq/faq_topic.aspx?fid=416
18 июн 09, 22:03    [7317967]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
djХомяГ
Guest
Как вариант , завести постоянную таблицу, в которой ввести дополнительное поле SPID (куда будет вставляться @@spid - процесс айди) Далее запрашиваете данные where SPID=@@spid, Ну и потом не забыть удалить данные. Повторюсь - это как вариант, возможно не самый лучший ...
18 июн 09, 22:06    [7317981]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
ITW
Member

Откуда:
Сообщений: 52
Senya_L
ITW,

https://www.sql.ru/faq/faq_topic.aspx?fid=416


Проблема в том что хранимые процедуры я вызываю из вне.
18 июн 09, 22:42    [7318075]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
ITW
Senya_L
ITW,

https://www.sql.ru/faq/faq_topic.aspx?fid=416


Проблема в том что хранимые процедуры я вызываю из вне.
"Из вне" чего и что мешает выполнить
INSERT INTO ... EXEC
?
18 июн 09, 22:48    [7318085]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Еще раз перечитав старт-топик кажется понял, что Вы хотите.
ITW
Проблема заключается в том, что надо результат выполнения первой хранимой процедуры (хп) передать во вторую хп (то есть строить отчеты по отобранным данным).
...
Как решить задую проблему?
Может быть обойтись без "перекачивания" данных с сервера на клиент и обратно? Для чего такие операции?

Если невозможно обойтись, попробуйте передавать через XML.
18 июн 09, 22:53    [7318092]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
ITW
Member

Откуда:
Сообщений: 52
Senya_L,

Задача:
Клиент устанавливает параметры отбора, сортировки и т.д. нажимает кнопочку "фильтр" :)
в гриде видит результат. если он его устраивает то по результату запускает всякие отчеты.


p.s. использую MS SQL 2000
18 июн 09, 23:06    [7318112]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
ITW
Клиент устанавливает параметры отбора, сортировки и т.д. ...
Ну и передавайте эти параметры в ХП, а уж там перезапрашивайте.

ЗЫ. Хотя, если честно, все равно не пойму, задлянафига переливать данные обратно на сервер. Вот, скажем, нафильтровал клиент там что-то. Почему сразу не построить отчет на месте, на том же клиенте?
18 июн 09, 23:11    [7318120]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
ITW
Member

Откуда:
Сообщений: 52
Senya_L,

В принципе можно хп фильтрации выполнять дважды.
1 раз для отображения результата
2 раз уже в отчетах
Но такой вариант будет работать намного дольше так как большое время выполнения хп-фильтрации.
Та и придется в хп отчетов передавать левые параметры для фильтра :(
18 июн 09, 23:12    [7318121]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
ITW
Member

Откуда:
Сообщений: 52
Senya_L,

так отчетов много.
все они строятся по результату фильтрации
18 июн 09, 23:14    [7318125]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
ITW
Senya_L,

так отчетов много.
все они строятся по результату фильтрации
А вас устроит не перекачивать все данные рекордсета, а, скажем, только первичные ключи записей?
18 июн 09, 23:15    [7318127]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
ITW
Member

Откуда:
Сообщений: 52
Senya_L,

Нет. так как в результате отбора должны быть данные в гриде по клиентах (название, долг и.т.д)
то есть результатом будет перечень клиентов с ихними данными.

У меня была мысля передавать в хп отчета ID клиентов из грида строкой через запятую. Но если их будет очень много. varcharа просто не хватит :(
18 июн 09, 23:21    [7318142]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
ITW
У меня была мысля передавать в хп отчета ID клиентов из грида строкой через запятую. Но если их будет очень много. varcharа просто не хватит :(
Ну я не работал с 2000-м, но тип text там же есть?
18 июн 09, 23:23    [7318146]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
ITW
Member

Откуда:
Сообщений: 52
Senya_L,

Есть :) он больше varchara?
varchar по моему имеет 8000
18 июн 09, 23:28    [7318166]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
ITW
Senya_L,

Есть :) он больше varchara?
varchar по моему имеет 8000
А BOL почитать? :)
18 июн 09, 23:32    [7318173]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
ITW
Member

Откуда:
Сообщений: 52
Senya_L,

нашел в BOL
text 2,147,483,647 characters
Решение было рядом как всегда рядом ))))))))))

Большое спасибо!!!!!!!!!!!!!!!
18 июн 09, 23:34    [7318181]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
Michael_N
Member

Откуда: Белокуриха, АК
Сообщений: 150
ITW
Senya_L,

нашел в BOL
text 2,147,483,647 characters
Решение было рядом как всегда рядом ))))))))))

Большое спасибо!!!!!!!!!!!!!!!


Зря радуетесь. Это изначально кривое решение. Что Вы будете делать с этим списком? Передавать в СП, а там динамически строить запрос? Так вариант, который предложил djХомяГ, лучше.
Почему вторая ХП не видит временную таблицу? В одной сессии все должно быть нормально. Какие компоненты используете? Как создаете ЛВТ?
19 июн 09, 07:46    [7318567]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
Andrey Ts
Member

Откуда: С-Пб
Сообщений: 516
Michael_N

Почему вторая ХП не видит временную таблицу? В одной сессии все должно быть нормально. Какие компоненты используете? Как создаете ЛВТ?

Здравая мысль.
ITW: ИМХО, вам нужно создавать временнную таблицу прямо из клиента ДО вызовы первой процедуры, в которой она заполняется. Тогда вторая процедура будет ее видеть.
19 июн 09, 09:13    [7318718]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18323
Передаю идешники в виде блоб поля.
Код в дельфи:
Function  GetSelectedString:String;
var BSelectedString : string;
    i, v :integer;
begin

   BSelectedString:='';
   qDetails.DisableControls;
   IF gDetails.Selection.SelectionType = gstNon
          then gDetails.SelectedRows.CurrentRowSelected := True;
   if gDetails.Selection.SelectionType = gstAll then
    begin
    SetLength(BSelectedString, qDetails.RecordCount*4);
    qDetails.First;
    for i := 0 to qDetails.RecordCount - 1 do
       begin
        v:=  qDetailsID.AsInteger;
        PInteger(@BSelectedString[i*4+1])^:=v;
        qDetails.next;
       end;
    end
   else
    begin
    SetLength(BSelectedString, gDetails.SelectedRows.Count*4);
    for i := 0 to gDetails.SelectedRows.Count - 1 do
       begin
        qDetails.GotoBookmark( Pointer( gDetails.SelectedRows[ i]));
        v:=  qDetailsID.AsInteger;
        PInteger(@BSelectedString[i*4+1])^:=v;
       end;
    end;
    qDetails.EnableControls;
   result := BSelectedString;
end;

...
          qDataSet.Parameters.ParamByName('@Text').DataType := ftBlob;
          qDataSet.Parameters.ParamByName('@Text').value  :=  GetSelectedString;
...

Эта функция распарсиват и возвращает уже набор идешников.
CREATE  FUNCTION [dbo].[TextToInt] (@text image)  
RETURNS @r table( id int identity primary key, ResInt int) AS  
BEGIN 


declare @I int, @LenText int
set @I = 1
set @LenText = DATALENGTH(@Text)
--declare @TTI table (ID int identity primary key, ResInt int)

while @i<=@LenText
begin

Insert into @r (ResInt)
values (ASCII(SUBSTRING(@Text,3+@i,1))*256*256*256
	+ASCII(SUBSTRING(@Text,2+@I,1))*256*256
		+ASCII(SUBSTRING(@Text,1+@I,1))*256
			+ASCII(SUBSTRING(@Text,0+@i,1))

	)
set @i = @i + 4
end

return

END

Эффективней, чем передавать идешники через запятую. Удобно джоиниить, и не надо делать динамический запрос. Быстрее, чем любой другой метод.
19 июн 09, 09:23    [7318761]     Ответить | Цитировать Сообщить модератору
 Re: Как передать результат запроса в хранимую процедуру?  [new]
ITW
Member

Откуда:
Сообщений: 52
Deff,
Спасибо!

Действительно Ваш вариант намного удобнее и быстрее чем парсить строку и переводить ее в переменную таблицу.

Тем более что вариант с передачей айдишников из грида более правильный чем использование результата выборки, так как в гриде можно по своему отсортировать или с группировать данные
19 июн 09, 10:39    [7319248]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить