#sql-server #tsql #stored-procedures #comparison
#sql-сервер #tsql #хранимые процедуры #сравнение
Вопрос:
Я создал хранимую процедуру QueryProductLines @ParamProductLineId Int
. Это работает нормально и возвращает результаты, которые оно должно.
Однако теперь я хочу создать дополнительную хранимую процедуру FindCommonProductLines @ParamProductLineIdOne INT, @ParamProductLineIdTwo
, которая будет вызывать QueryProductLines
хранимую процедуру дважды, выполнять сравнение и возвращать любые распространенные продукты.
Например:
- Первая линейка продуктов:
- Продукт A Продукт B Продукт C Продукт D Продукт E
- Вторая строка продукта:
- Продукт C, Продукт D, продукт F, продукт G
Хранимая процедура вернет продукт C и продукт D (поскольку они являются общими для обеих продуктовых линеек).
Возможно ли это только в рамках хранимой процедуры? Любая схема того, как это может быть достигнуто, была бы весьма признательна.
Комментарии:
1. @a_horse_with_no_name Мои извинения, сделано.
2. По какой-либо конкретной причине вы хотите
FindCommonProductLines
вызватьQueryProductLines
, а не просто выполнить запрос напрямую?
Ответ №1:
Один из подходов заключается в вызове существующей хранимой процедуры для каждой линейки продуктов, используя INSERT...EXEC
для записи результатов каждого из них во временную таблицу / переменную. Схема таблицы / переменной должна соответствовать схеме QueryProductLines
результирующего набора, хотя вы можете игнорировать ненужные столбцы в конечном запросе.
Ниже приведен пример этого метода.
CREATE PROCEDURE dbo.FindCommonProductLines
@ParamProductLineIdOne int
, @ParamProductLineIdTwo int
AS
SET NOCOUNT ON;
DECLARE @ProductLineIdOne TABLE(
ProductName varchar(100) PRIMARY KEY
);
DECLARE @ProductLineIdTwo TABLE(
ProductName varchar(100) PRIMARY KEY
);
INSERT INTO @ProductLineIdOne(ProductName)
EXEC dbo.QueryProductLines @ParamProductLineId = @ParamProductLineIdOne;
INSERT INTO @ProductLineIdTwo(ProductName)
EXEC dbo.QueryProductLines @ParamProductLineId = @ParamProductLineIdTwo;
SELECT p1.ProductName
FROM @ProductLineIdOne AS p1
JOIN @ProductLineIdTwo AS p2 ON p2.ProductName = p1.ProductName;
GO
С точки зрения производительности, но за счет повторного использования кода, было бы более эффективно разработать специализированный запрос для возврата обычных продуктов.