У меня есть таблица со списком «Отчеты» или «Письма для переписки» (html-файлы). Этот список появится в раскрывающемся списке на веб-сайте. Некоторым из этих элементов потребуется «проверить», чтобы увидеть, разрешено ли их добавлять в раскрывающийся список.
Пример того, как эта таблица (я удалил столбцы, которые не нужно было отображать):
В этой таблице есть столбец "Cor_PolNeedCheck_ToShow". Это значение указывает на другую таблицу, в которой хранится запрос для этого файла.
Отсюда мне нужно создать запрос, который будет составлять фактический список, который будет отображаться. Но для этого мне нужно выполнить запрос из второй таблицы, чтобы выполнить проверку. Для этого я создал следующий запрос, и он возвращает ожидаемые результаты:
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))