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

Откуда:
Сообщений: 11
Нужно решить такую задачку:
Есть таблица с документами, в которой присутствует поле CheckSum, заполняемое неважно как при вставке записи. Есть хранимая процедура, способная эту сумму рассчитать. Процедура принимает параметры "Название таблицы", "Номер документа" , на их основе формируется динамический запрос, считающий и возвращающий нужное значение. В итоге требуется сделать выборку документов, у которых хранящаяся в них сумма совпадает с рассчитанной. Как это проще реализовать? Без курсоров обойтись не удастся?
20 ноя 09, 14:42    [7956909]     Ответить | Цитировать Сообщить модератору
 Re: Использование в условиях WHERE результатов, получаемых хранимой процедурой  [new]
Glory
Member

Откуда:
Сообщений: 104760
Раз уже "на их основе формируется динамический запрос" то почему бы процедуре еще и не добавлять в динамический запрос нужное условие ?
20 ноя 09, 14:44    [7956929]     Ответить | Цитировать Сообщить модератору
 Re: Использование в условиях WHERE результатов, получаемых хранимой процедурой  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
b_m_d
Без курсоров обойтись не удастся?
ну почему же... циклов ведь тоже еще никто не отменял
20 ноя 09, 15:02    [7957069]     Ответить | Цитировать Сообщить модератору
 Re: Использование в условиях WHERE результатов, получаемых хранимой процедурой  [new]
b_m_d
Member

Откуда:
Сообщений: 11
Glory
Раз уже "на их основе формируется динамический запрос" то почему бы процедуре еще и не добавлять в динамический запрос нужное условие ?

Честно говоря, не понял. Как и зачем мне менять текст запроса?

Грубо говоря, нужен запрос такого вида:
SELECT [DocNo_] FROM dbo.Tbl1
WHERE [Checksum] = dbo.xp_GetChecksum('Tbl1',[DocNo_])
Но так ведь хранимую процедуру вызывать нельзя. Или я ошибаюсь?
20 ноя 09, 15:14    [7957136]     Ответить | Цитировать Сообщить модератору
 Re: Использование в условиях WHERE результатов, получаемых хранимой процедурой  [new]
b_m_d
Member

Откуда:
Сообщений: 11
Попробовал сделать через функцию. Получаю ошибку "Внутри этой функции можно вызывать только функции и расширенные хранимые процедуры."
Текст функции примерно такой:

ALTER FUNCTION [dbo].[uf_GetChecksum](@TableName varchar(30),@DocNo varchar(20)) RETURNS int
BEGIN
DECLARE
@Checksum int,
@ParmDefinition nvarchar(500),
@SqlStr as NVarchar(4000),

SET @SqlStr = 'select @ChecksumOUT = (select count(*) from ...)'
SET @ParmDefinition = N'@ChecksumOUT int OUTPUT';
EXECUTE sp_executesql @SQLStr, @ParmDefinition, @ChecksumOUT = @Checksum OUTPUT;
RETURN(@Checksum)
END

Это тоже не вариант?
20 ноя 09, 15:38    [7957308]     Ответить | Цитировать Сообщить модератору
 Re: Использование в условиях WHERE результатов, получаемых хранимой процедурой  [new]
Maxx
Member [скрыт]

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

ну так вы ответ сами и привели..нельзя ХП вызывать внутри ф-ций
20 ноя 09, 15:44    [7957355]     Ответить | Цитировать Сообщить модератору
 Re: Использование в условиях WHERE результатов, получаемых хранимой процедурой  [new]
Glory
Member

Откуда:
Сообщений: 104760
b_m_d
Glory
Раз уже "на их основе формируется динамический запрос" то почему бы процедуре еще и не добавлять в динамический запрос нужное условие ?

Честно говоря, не понял. Как и зачем мне менять текст запроса?

Грубо говоря, нужен запрос такого вида:
SELECT [DocNo_] FROM dbo.Tbl1
WHERE [Checksum] = dbo.xp_GetChecksum('Tbl1',[DocNo_])
Но так ведь хранимую процедуру вызывать нельзя. Или я ошибаюсь?

Мне показалось, что у вас процедура выдает нужный набор, а не возвращает параметры
С таким подходом ничего кроме курсора не получится
20 ноя 09, 15:46    [7957383]     Ответить | Цитировать Сообщить модератору
 Re: Использование в условиях WHERE результатов, получаемых хранимой процедурой  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
У вас есть алгоритм который нечто рассчитывает по одному документу перепишите его чтобы он работал с множеством (всей таблицей). Далее join выхода этой процедуры с вашей таблицей.
Хотя, имхо, логичнее иметь это расчётное значение в самой таблице (добавить ваш алгоритм в процедуры вставки и обновления), но это уже сильно зависит от вашей специфики.
--------------------------------------------------------------
Дьявол кроется в деталях.
20 ноя 09, 15:52    [7957437]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить