#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))