Возвращает результат хранимой процедуры из второй хранимой процедуры?

#sql #sql-server #stored-procedures

#sql #sql-сервер #хранимые процедуры

Вопрос:

Это вопрос о некоторых хранимых процедурах, запущенных в MSSQL 8 (я думаю, что это SQL Server 2000).

У меня есть две хранимые процедуры, оставленные моим предшественником в компании.

Окно «Изменить» для первой процедуры выглядит примерно так:

 ALTER PROCEDURE [dbo].[Proc1]
    @ID,
    @someBool

AS
BEGIN

SELECT colA, colB, colC
FROM   myTable
WHERE  colA = @ID AND colB = @someBool

END
  

Вторая процедура очень похожа, являясь чем-то вроде:

 ALTER PROCEDURE [dbo].[Proc2]
    @ID

AS
BEGIN

SELECT colA, colB
FROM   myTable
WHERE  colA = @ID AND colB = FALSE

END
  

Очевидно, что реальные процедуры сложнее этой и требуют гораздо большего обслуживания при внесении изменений.

Вместо того, чтобы поддерживать эти два запроса по отдельности, что в значительной степени отстой, мне было интересно, есть ли какой-либо способ просто заставить Proc2 сделать что-то вроде:

 ALTER PROCEDURE [dbo].[Proc2]
    @ID

AS
BEGIN

EXEC Proc1(@ID, FALSE)
"drop colC"
"return modified result"

END
  

Есть идеи о наилучшем способе решения этой проблемы?

Ответ №1:

Может быть, что-то вроде этого?

 CREATE TABLE #Proc1TempResults
(
    ColA INT, --OR WHATEVER DATA TYPE
    ColB INT,
    ColC INT
)

INSERT INTO #Proc1TempResults (ColA, ColB, ColC)
EXEC Proc1 @ID, 0

SELECT ColA, ColB
FROM #Proc1TempResults
  

Комментарии:

1. Я получаю сообщение об ошибке при первом параметре, отправляемом в Proc1. Нужно ли мне что-то добавить в Proc1, чтобы использовать его результаты?

2. Извиняюсь, смотрите отредактированный ответ выше. Синтаксис был неправильным при вызове SP.

Ответ №2:

Трудность в том, что хранимые процедуры нереляционны. Следовательно, помимо участия в операторе Insert, они не могут быть использованы в других запросах; или, если воспользоваться терминологией Linq, они не являются «составными».

Вы также хотите рассмотреть функции с табличным значением (которые, я полагаю, доступны уже в SQL Server 2000))