Сохраненный в таблице запрос для выполнения в предложении where другого запроса - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть таблица со списком «Отчеты» или «Письма для переписки» (html-файлы). Этот список появится в раскрывающемся списке на веб-сайте. Некоторым из этих элементов потребуется «проверить», чтобы увидеть, разрешено ли их добавлять в раскрывающийся список.

Пример того, как эта таблица (я удалил столбцы, которые не нужно было отображать): MainTable

В этой таблице есть столбец "Cor_PolNeedCheck_ToShow". Это значение указывает на другую таблицу, в которой хранится запрос для этого файла. enter image description here

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

    DECLARE @retvalue  INT
    DECLARE @Paramater NVARCHAR(20) = '241215'
    DECLARE @Cor_GroupCde NVARCHAR(10) = 248

    DECLARE @Statement NVARCHAR(500);

    SELECT @Statement = (SELECT Lookup_Query + @Paramater FROM [dbo].[Ref_Lookup] 
                WHERE Lookup_ID = (Select Cor_PolNeedCheck_ToShow  FROM dbo.Ref_Correspondence WHERE Cor_Group_Cde = @Cor_GroupCde));

    EXEC @retvalue = sp_executesql @Statement;
    PRINT @retvalue

Это значение необходимо снова передать в запрос, чтобы проверить, показывать или не показывать каждую запись. Это запрос, который будет запущен для отображения элементов (я добавил @retvalue вышеупомянутого в запросе, просто чтобы показать, что он должен делать). Этот запрос находится в сохраненном процессе, где @Paramater будет передан (сверху) из приложения, а затем будет использоваться по мере необходимости для нижеследующего (так как вышеприведенный запрос должен соответствовать этому).

    SELECT Cor_Group_Cde, Cor_Desc
    FROM Ref_Correspondence
    WHERE Cor_Show = 'Y' AND Cor_Prod_List  Like '%#' + @ProdID + '#%'
    AND (Cor_PolNeedCheck_ToShow IS NULL OR --@retValue > 0)

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно вставить @retValue в предложение where. У меня есть хотя и сохраненный процесс, но хранимый процесс не может быть вызван в предложении where. Затем я определяю пользовательскую функцию, но проблема в том, что вы не можете вызвать хранимый процесс (sp_executesql) в функции.

Из-за стандартов компании я не могу сделать это в приложении. Есть ли способ обойти это или есть способ сделать это, что я, возможно, пропустил выше?

-------------------- РЕДАКТИРОВАТЬ ---------------------

Созданная мной функция выглядит следующим образом:

    USE [DBName]
    GO
    /****** Object:  UserDefinedFunction [dbo].[ufn_CorrespondenceCheckResult]    Script Date: 4/11/2019 5:35:04 PM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER FUNCTION [dbo].[ufn_CorrespondenceCheckResult] 
    (
      @Paramater nvarchar(20),
      @Cor_GroupCde nvarchar(10)
    )
   RETURNS int
   AS
   BEGIN

DECLARE @Statement nvarchar(MAX);
DECLARE @Return int;

set @Return = 0;

SELECT @Statement = (SELECT Lookup_Query + @Paramater FROM [dbo].[Ref_Lookup] 
                WHERE Lookup_ID = (Select Cor_PolNeedCheck_ToShow  FROM dbo.Ref_Correspondence WHERE Cor_Group_Cde = @Cor_GroupCde));

EXEC @Return = sp_executesql @Statement;

return @Return;

END

Запуск вышеуказанной функции в моем скрипте выдает ошибку « Только функции и некоторые расширенные хранимые процедуры могут быть выполнены из функции. »:

    SELECT Cor_Group_Cde, Cor_Desc
FROM Ref_Correspondence
WHERE Cor_Show = 'Y' AND Cor_Prod_List  Like '%#' + @ProdID + '#%'
AND (Cor_PolNeedCheck_ToShow IS NULL OR ((SELECT [dbo].[ufn_CorrespondenceCheckResult] (@Paramater,@Cor_GroupCde)) > 0))

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Было бы лучше преобразовать вашу хранимую процедуру в функцию, если это возможно. Тогда вы можете использовать функцию в предложении WHERE.

Если вы не можете преобразовать ее в функцию, лучше выполнить SP и сохранить полный результат в переменной. Теперь вы можете использовать эту таблицу в предложении WHERE.

0 голосов
/ 07 ноября 2019

Вы должны сохранить результат хранимой процедуры в переменной, а затем использовать его в условии следующего оператора. Вы можете использовать параметр OUTPUT для возврата значения из хранимой процедуры.

DECLARE @count INT

EXEC FindProductByModel  --CREATE a stored procedure FindProductByModel  instead of a function
@Paramater = '241215',
@Cor_GroupCde = '248',
@retvalue= @count OUTPUT  --@retval is an output paramater of your stored procedure

SELECT Cor_Group_Cde, Cor_Desc
FROM Ref_Correspondence
WHERE Cor_Show = 'Y' AND Cor_Prod_List  Like '%#' + @ProdID + '#%'
AND (Cor_PolNeedCheck_ToShow IS NULL OR @count>0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...