SQL Server: хранимая процедура возвращает набор данных и выполняет сравнение

#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
  

С точки зрения производительности, но за счет повторного использования кода, было бы более эффективно разработать специализированный запрос для возврата обычных продуктов.