使用报告参数调用标量值函数
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')))
为任何能提供帮助的人免费提供一袋奶酪(一袋奶酪是我的感激之情)
从函数调用中删除方括号允许它通过。由于其他原因,我不得不在此之后稍微修改一下功能,但它现在可以工作了。
总有一些蠢事。
真不敢相信我没想到要早点尝试。
我已经创建了一个标量值函数 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')))
为任何能提供帮助的人免费提供一袋奶酪(一袋奶酪是我的感激之情)
从函数调用中删除方括号允许它通过。由于其他原因,我不得不在此之后稍微修改一下功能,但它现在可以工作了。
总有一些蠢事。
真不敢相信我没想到要早点尝试。