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

Откуда: Санкт-Петербург
Сообщений: 520
Добрый день!
Оговорюсь сразу, с хранимыми процедурами только начинаю разбираться.
Возможно что мой вопрос уже обмусоливался не раз, но я не могу найти ответ на него, т.к. не получается правильно составить поисковый запрос. Не ругайтесь :)

Приведенный ниже код не мой, человек его писавший уволился, а мне досталось его детище :(

Итак:
Требуется сделать выборку всех данных из таблицы со структурой ID-Name-Date c добавлением в нее столбца с данными полученными из хранимой процедуры.

Код процедуры:

USE [Workflows]
GO
/****** Object:  StoredProcedure [dbo].[GetRequestApprovalStatus]    Script Date: 07/04/2013 15:07:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- =============================================
ALTER PROCEDURE [dbo].[GetRequestApprovalStatus] 
	-- Add the parameters for the stored procedure here
	@id_request VARCHAR(38) = NULL, @id_approval INT = NULL OUTPUT, @approval_count INT = NULL OUTPUT,
	@id_approver UNIQUEIDENTIFIER = NULL, @id_action INT = NULL OUTPUT, @approval_status INT = NULL OUTPUT,
	@request_type INT = NULL
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT 
			@request_type = request_type
    FROM
			gc_request
	WHERE
			id_request = @id_request
			
    SET rowcount 0
    
	SELECT 
			*
	INTO
			#approvers_tmp
	FROM
			gc_request_approvers
	WHERE
			id_request = @id_request
	SET rowcount 1
	
	SELECT
			@id_approver = id_approver
	FROM
			#approvers_tmp
	SET @approval_status = '0'
	SET @approval_count = '0'			
	WHILE @@ROWCOUNT <> 0
	BEGIN
	SET rowcount 0
	
	SELECT
			*
	FROM
			#approvers_tmp
	WHERE
			id_approver = @id_approver
	
	DELETE FROM
			#approvers_tmp
	WHERE
			id_approver = @id_approver
			
	SET rowcount 1
	
	SELECT
			@id_action = id_action
	FROM
			gc_request_log
	WHERE
			id_user = @id_approver
	AND
			id_request = @id_request
	

	IF (@id_action = '2' OR @id_action = '5')
		BEGIN
		SET @approval_status = '2'
		RETURN
		END
	IF @id_action = '3'
		BEGIN
		SET @approval_status = '3'
		RETURN
		END
	IF @id_action = '5'
		BEGIN
		SET @approval_status = '2'
		RETURN
		END
	IF (@id_action = '1' AND @approval_status = '0' AND @approval_count = '0' AND @request_type != '1')
		BEGIN
		SET @approval_status = '0'
		SET @approval_count = '1'
		END
	ELSE
		BEGIN
		SET @approval_status = '1'
		END
	IF @id_action is NULL
		BEGIN
		SET @approval_status = '0'
		END
		
	
	SELECT
			@id_approver = id_approver
	FROM
			#approvers_tmp
	
	
	END
	SET rowcount 0
	DROP TABLE #approvers_tmp
END


В процедуру я должен передавать только параметр ID из таблицы. Далее она обрабатывает несколько таблиц и выдает мне параметр @Approval_status.
И вот именно этот параметр мне требуется получить при запросе типа
Select * from My_table


Подскажите, пожалуйста, как это правильно реализовывается.

Спасибо.

Никогда не бойся делать то, что не умеешь.
Помни, профессионалы построили Титаник, а Ковчег любители.
4 июл 13, 15:40    [14523057]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение хранимой процедуры для каждой строки в таблице  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Т.е. в результате должна получиться выборка в виде
ID - Name - Date - Appr_status
4 июл 13, 15:42    [14523068]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение хранимой процедуры для каждой строки в таблице  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
CROSS APPLY?
APPLY
4 июл 13, 15:49    [14523129]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение хранимой процедуры для каждой строки в таблице  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Сергей Викт.,

Не выходит каменный цветок :(

пишу
select d.id_request, d.request_num
from gc_request as d
cross apply GetRequestApprovalStatus (d.id_request) as st 

ругается на Invalid object name 'GetRequestApprovalStatus'.

Как я понимаю, то такая конструкция и не должна работать, т.к. в процедуре много значений с флагом Output,
а мне требуется получить только одно из них....
4 июл 13, 16:15    [14523327]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение хранимой процедуры для каждой строки в таблице  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Kast2K
Сергей Викт.,

Не выходит каменный цветок :(

пишу
select d.id_request, d.request_num
from gc_request as d
cross apply GetRequestApprovalStatus (d.id_request) as st 

ругается на Invalid object name 'GetRequestApprovalStatus'.

Как я понимаю, то такая конструкция и не должна работать, т.к. в процедуре много значений с флагом Output,
а мне требуется получить только одно из них....

cross apply это для табличных фунций или inline выражений. Процедура не прокатит. Если хочется именно процедуру для каждой строки то курсор вам в помощь.
4 июл 13, 16:24    [14523386]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение хранимой процедуры для каждой строки в таблице  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Мистер Хенки,
а еще можно передавать в ХП табличный параметр или через временную таблицу - но это тогда надо процедуру по любому переделывать.
4 июл 13, 16:27    [14523412]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение хранимой процедуры для каждой строки в таблице  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Kast2K
Сергей Викт.,

Не выходит каменный цветок :(

пишу
select d.id_request, d.request_num
from gc_request as d
cross apply GetRequestApprovalStatus (d.id_request) as st 

ругается на Invalid object name 'GetRequestApprovalStatus'.

Как я понимаю, то такая конструкция и не должна работать, т.к. в процедуре много значений с флагом Output,
а мне требуется получить только одно из них....
cross apply dbo.GetRequestApprovalStatus (d.id_request) as st
4 июл 13, 16:39    [14523511]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение хранимой процедуры для каждой строки в таблице  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Мистер Хенки
курсор вам в помощь.
Никогда не предлагайте эту гадость.

Или пусть перестаёт извращаться или пусть поймёт что это не его.
4 июл 13, 17:04    [14523662]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение хранимой процедуры для каждой строки в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Cygapb-007
Kast2K
Сергей Викт.,

Не выходит каменный цветок :(

пишу
select d.id_request, d.request_num
from gc_request as d
cross apply GetRequestApprovalStatus (d.id_request) as st 


ругается на Invalid object name 'GetRequestApprovalStatus'.

Как я понимаю, то такая конструкция и не должна работать, т.к. в процедуре много значений с флагом Output,
а мне требуется получить только одно из них....
cross apply dbo.GetRequestApprovalStatus (d.id_request) as st
Ну нельзя процедуру запихнуть в SELECT!
Даже если схему написать.
4 июл 13, 17:07    [14523690]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение хранимой процедуры для каждой строки в таблице  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Cygapb-007
Kast2K
Сергей Викт.,

Не выходит каменный цветок :(

пишу
select d.id_request, d.request_num
from gc_request as d
cross apply GetRequestApprovalStatus (d.id_request) as st 

ругается на Invalid object name 'GetRequestApprovalStatus'.

Как я понимаю, то такая конструкция и не должна работать, т.к. в процедуре много значений с флагом Output,
а мне требуется получить только одно из них....
cross apply dbo.GetRequestApprovalStatus (d.id_request) as st

так ведь GetRequestApprovalStatus это процедура
4 июл 13, 17:10    [14523703]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение хранимой процедуры для каждой строки в таблице  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Семеен Семееееныч ...
Сорь:)
4 июл 13, 17:23    [14523783]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение хранимой процедуры для каждой строки в таблице  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Kast2K,

А еще когда будете переписывать эту гадость, то избавьтесь от конструкции SET ROWCOUNT, ей не долго жить осталось.
4 июл 13, 19:45    [14524446]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить