使用报告参数调用标量值函数

Calling scalar valued function with report parameters

我已经创建了一个标量值函数 return 一组记录的最大安全分类。当我定义它时,一切似乎都执行得很好,但是当我尝试调用它时,我被告知我需要声明标量变量“@START”并且无法绑定多部分标识符 "innovator.GetMaxSecurityTPSummary(@STATE, @START, @END)"。 (微软 SQL 服务器,错误: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')))

为任何能提供帮助的人免费提供一袋奶酪(一袋奶酪是我的感激之情)

从函数调用中删除方括号允许它通过。由于其他原因,我不得不在此之后稍微修改一下功能,但它现在可以工作了。

总有一些蠢事。

真不敢相信我没想到要早点尝试。