Повторно использовать где условие на протяжении хранимой процедуры? - PullRequest
2 голосов
/ 03 апреля 2019

Я создал одну хранимую процедуру, которая возвращает записи из нескольких запросов выбора.

См. Запрос ниже:

DECLARE @UserId UNIQUEIDENTIFIER = '96105876-AB55-4D28-A8DD-6BFEC9D38EF8'

SELECT 
    CD.[Name],
    CD.[ASIN],
    CD.[Category],
    CD.[Quantity],
    CD.[Total],
    CD.[Weight]
FROM CartDetails CD
INNER JOIN Cart C ON C.Id = CD.CartId 
INNER JOIN Users U ON U.Id = C.UserId
WHERE U.Id = @UserId AND U.Active = 1 AND U.Deleted = 0

SELECT  
    DCC.DiscountAmount, 
    DCC.DiscountCouponId
FROM DiscountCouponConsumed DCC
INNER JOIN Users U ON U.Id = DCC.UserId
WHERE U.Id = @UserId AND U.Active = 1 AND U.Deleted = 0

Здесь я написал один и тот же запрос (который всегда остается неизменным) в условии условия. Теперь мой вопрос: можем ли мы написать where запрос один раз и использовать его для каждого оператора select?

Ответы [ 4 ]

2 голосов
/ 03 апреля 2019

Вы можете сохранить действительные идентификаторы пользователя во временной таблице, которая заполняется в соответствии с общим предложением where. Вы можете расширить этот метод на любое количество запросов.

DECLARE @UserId UNIQUEIDENTIFIER = '96105876-AB55-4D28-A8DD-6BFEC9D38EF8';

declare @User table (id uniqueidentifier);

insert into @User (id)
  select id
  from Users U
  where U.Id = @UserId AND U.Active = 1 AND U.Deleted = 0;

SELECT 
    CD.[Name],
    CD.[ASIN],
    CD.[Category],
    CD.[Quantity],
    CD.[Total],
    CD.[Weight]
FROM CartDetails CD
INNER JOIN Cart C ON C.Id = CD.CartId 
INNER JOIN Users U ON U.Id = C.UserId
--WHERE U.Id = @UserId AND U.Active = 1 AND U.Deleted = 0
where U.id in (select id from @User);

SELECT  
  DCC.DiscountAmount,
  DCC.DiscountCouponId
FROM DiscountCouponConsumed DCC
INNER JOIN Users U ON U.Id = DCC.UserId
--WHERE U.Id = @UserId AND U.Active = 1 AND U.Deleted = 0
where U.id in (select id from @User);
1 голос
/ 03 апреля 2019

Если у вас есть отдельные операторы выбора без связи между ними, это может вам помочь.Подготовьте выбранные запросы и запросы Where в отдельных переменных и объедините их вместе перед выполнением.

DECLARE @UserId UNIQUEIDENTIFIER = '96105876-AB55-4D28-A8DD-6BFEC9D38EF8'

DECLARE @Query NVARCHAR(MAX) , @SelectQuery NVARCHAR(MAX), @WhereQuery NVARCHAR(MAX)

SET @WhereQuery = 'WHERE U.Id = @UserId AND U.Active = 1 AND U.Deleted = 0'

 -- Query 1 

SET @SelectQuery =
'SELECT 
    CD.[Name],
    CD.[ASIN],
    CD.[Category],
    CD.[Quantity],
    CD.[Total],
    CD.[Weight]
FROM CartDetails CD
INNER JOIN Cart C ON C.Id = CD.CartId 
INNER JOIN Users U ON U.Id = C.UserId'

SET @Query = @SelectQuery + @WhereQuery

EXEC (@Query)


--- Query 2

SET @Query = NULL 

SET @SelectQuery = NULL

SET @SelectQuery ='
SELECT  
    DCC.DiscountAmount, 
    DCC.DiscountCouponId
FROM DiscountCouponConsumed DCC
INNER JOIN Users U ON U.Id = DCC.UserId '

SET @Query = @SelectQuery + @WhereQuery

EXEC (@Query)
0 голосов
/ 09 апреля 2019

@ MarcinJ предоставил самый простой ответ в комментарии, который, я думаю, заслуживает того, чтобы на него ответить.

Если вы всегда фильтруете записи пользователей таким способом, просто запустите запрос проверить, является ли пользователь активным и не удален в начале ваша хранимая процедура, и если она не соответствует вашим условиям, перезагрузите @UserId в NULL, чтобы никакой другой запрос не дал результатов

т.е. иметь следующий код в верхней части процедуры:

select @UserId = case when exists (
    select 1
    from Users U
    where U.Id = @UserId AND U.Active = 1 AND U.Deleted = 0
  ) then @UserId else null end;
0 голосов
/ 03 апреля 2019

Близко к ответу Дейлса, но присоединяется к @ Users.

DECLARE @UserId UNIQUEIDENTIFIER = '96105876-AB55-4D28-A8DD-6BFEC9D38EF8';

DECLARE @Users TABLE
(
    Id INT,
    Active BIT,
    Deleted BIT
);

INSERT INTO @Users
(
    Id,
    Active,
    Deleted
)
SELECT Id,
       Active,
       Deleted
FROM Users
WHERE U.Id = @UserId
      AND U.Active = 1
      AND U.Deleted = 0;

SELECT CD.Name,
       CD.ASIN,
       CD.Category,
       CD.Quantity,
       CD.Total,
       CD.Weight
FROM CartDetails CD
    INNER JOIN Cart C
        ON C.Id = CD.CartId
    INNER JOIN @Users U
        ON U.Id = C.UserId;

SELECT DCC.DiscountAmount,
       DCC.DiscountCouponId
FROM DiscountCouponConsumed DCC
    INNER JOIN @Users U
        ON U.Id = DCC.UserId;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...