Я создал функцию скалярного значения, чтобы вернуть максимальную классификацию безопасности для набора записей. Кажется, что все отлично работает, когда я его определяю, но когда я пытаюсь это назвать, мне говорят, что мне нужно объявить скалярную переменную «@START» и что многочастный идентификатор «innovator.GetMaxSecurityTPSummary» (@STATE, @START , @END) "не могут быть связаны. (Microsoft SQL Server, ошибка: 4104)Вызов функции скалярного значения с параметрами отчета
Функция:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
Alter FUNCTION [innovator].[GetMaxSecurityTPSummary]
(
@State As varchar, @START As varchar, @END As varchar
)
RETURNS varchar(2048)
AS
BEGIN
-- Declare the return variable here
DECLARE @MaxSecurity varchar(2048)
SET @MaxSecurity = '';
-- Add the T-SQL statements to compute the return value here
select @MaxSecurity = (SELECT TOP (1) SECURITY_CLASSIFICATION
FROM innovator.TP AS tp1
WHERE (IS_CURRENT = 1) AND (CREATED_ON >= CONVERT(datetime, @START, 104)) AND (CREATED_ON <= CONVERT(datetime, @END, 104))
AND (STATE = 'Closed') AND (@STATE = 'Closed') OR
(IS_CURRENT = 1) AND (CREATED_ON >= CONVERT(datetime, @START, 104)) AND (CREATED_ON <= CONVERT(datetime, @END, 104))
AND (STATE <> 'Closed') AND (@STATE = 'Open')
ORDER BY (CASE SECURITY_CLASSIFICATION WHEN 'Unclassified' THEN 1 WHEN 'Protected A' THEN 2 WHEN 'Protected B' THEN 3 WHEN 'Protected C'
THEN 4 WHEN 'Classified' THEN 5 WHEN 'Secret' THEN 6 WHEN 'Top Secret' THEN 7 ELSE 0 END) DESC)
-- Return the result of the function
RETURN @MaxSecurity;
END
Запрос вызова функции:
SELECT TP_ID, innovator.[GetMaxSecurityTPSummary(@STATE, @START, @END)] AS SecurityMax
FROM innovator.TP AS tp
WHERE (IS_CURRENT = 1) AND (CREATED_ON >= CONVERT(datetime, @START, 104)) AND (CREATED_ON <= CONVERT(datetime, @END, 104)) AND
(STATE = 'Closed') AND (@STATE = 'Closed') OR
(IS_CURRENT = 1) AND (CREATED_ON >= CONVERT(datetime, @START, 104)) AND (CREATED_ON <= CONVERT(datetime, @END, 104)) AND
(STATE <> 'Closed') AND (@STATE = 'Open')
UNION
SELECT NULL AS Expr1, 'N/A' AS Expr2
WHERE (NOT EXISTS
(SELECT id
FROM innovator.TP AS tp1
WHERE (IS_CURRENT = 1) AND (CREATED_ON >= CONVERT(datetime, @START, 104)) AND (CREATED_ON <= CONVERT(datetime, @END, 104))
AND (STATE = 'Closed') AND (@STATE = 'Closed') OR
(IS_CURRENT = 1) AND (CREATED_ON >= CONVERT(datetime, @START, 104)) AND (CREATED_ON <= CONVERT(datetime, @END, 104))
AND (STATE <> 'Closed') AND (@STATE = 'Open')))
Свободный мешок cheesies для тех, кто может помочь (и мешок я имею в виду мою благодарность)
Как вы передаете значения в '@ STATE',' @ START' и '@ END' в своем запросе? Вы их вообще объявили? – PicoDeGallo
Запрос используется внутри отчета в visual studio, поэтому значения для @STATE и т. Д. Определяются пользователем (в качестве параметров отчета), поэтому они объявляются. Используя эти (@STATE и т. Д.) Любым другим способом, но вышеупомянутый вызов функции не вызывает никаких проблем. Назначение заказа и выбор только верхней записи дает мне только самую высокую классификацию безопасности всех записей, содержащихся в наборе. – JEJoll
Вы отобразили параметры в службах отчетов. Похоже, что параметры не отображаются. –