我有一个SQL视图,它使用字符串参数调用标量函数。问题是字符串偶尔会有特殊字符导致函数失败。
视图查询如下所示:
SELECT TOP (100) PERCENT
Id, Name, StartDate, EndDate
,dbo.[fnGetRelatedInfo] (Name) as Information
FROM dbo.Session
该功能如下所示:
ALTER FUNCTION [dbo].[fnGetRelatedInfo]( @Name varchar(50) )
RETURNS varchar(200)
AS
BEGIN
DECLARE @Result varchar(200)
SELECT @Result = ''
SELECT @Result = @Result + Info + CHAR(13)+CHAR(10)
FROM [SessionInfo]
WHERE SessionName = @Name
RETURN @Result
END
如何转义名称值,以便在传递给函数时可以正常工作?
答案 0 :(得分:1)
我猜这个问题是dbo.Session.Name
中的非unicode字符。由于函数的参数是VARCHAR
,它只会保存unicode字符,因此传递给函数时非Unicode字符会丢失。解决方法是将参数更改为NVARCHAR(50)
。
但是,如果您关心性能,更重要的是一致,可靠的结果会立即停止使用此功能。改变你的看法只是:
SELECT s.ID,
s.Name,
s.StartDate,
s.EndDate,
( SELECT si.Info + CHAR(13)+CHAR(10)
FROM SessionInfo AS si
WHERE si.SessionName = s.Name
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') AS Information
FROM dbo.Session AS s;
使用变量连接可能会导致意外结果,这取决于执行计划的内部路径。所以我会立即将其作为一种解决方案。不仅如此,标量UDF的RBAR特性意味着它根本无法很好地扩展。
进行此分组连接的各种方法是benchmarked here,其中CLR实际上是赢家,但这并不总是一种选择。