0

Я создал функцию скалярного значения, чтобы вернуть максимальную классификацию безопасности для набора записей. Кажется, что все отлично работает, когда я его определяю, но когда я пытаюсь это назвать, мне говорят, что мне нужно объявить скалярную переменную «@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 для тех, кто может помочь (и мешок я имею в виду мою благодарность)

+0

Как вы передаете значения в '@ STATE',' @ START' и '@ END' в своем запросе? Вы их вообще объявили? – PicoDeGallo

+0

Запрос используется внутри отчета в visual studio, поэтому значения для @STATE и т. Д. Определяются пользователем (в качестве параметров отчета), поэтому они объявляются. Используя эти (@STATE и т. Д.) Любым другим способом, но вышеупомянутый вызов функции не вызывает никаких проблем. Назначение заказа и выбор только верхней записи дает мне только самую высокую классификацию безопасности всех записей, содержащихся в наборе. – JEJoll

+0

Вы отобразили параметры в службах отчетов. Похоже, что параметры не отображаются. –

ответ

1

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

Это всегда что-то глупое.

Не могу поверить, что я не думал, чтобы попробовать это раньше.