在查询中转义SQL函数字符串参数

时间:2015-11-17 17:30:03

标签: sql sql-server

我有一个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

如何转义名称值,以便在传递给函数时可以正常工作?

1 个答案:

答案 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实际上是赢家,但这并不总是一种选择。