标量UDF中的SUBSTRING - 意外返回

时间:2014-10-10 17:43:36

标签: sql sql-server-2012

我在SSMS 2012工作。我有一个标量UDF,用于测试某个值是否为3位数:

CREATE FUNCTION [dbo].[test8] (@input nvarchar)
RETURNS varchar(50)
AS
BEGIN
    DECLARE @output varchar(50)
    SET @output = CASE
        WHEN LEN(@input) <> 3 THEN 'failure' --must be 3 characters
        WHEN LEFT(@input,1) NOT LIKE '%[123456789]%' THEN 'failure' --first character must be a natural number
        WHEN SUBSTRING(@input,2,1) NOT LIKE '%[0123456789]%' THEN 'failure' --second character must be a natural number (zero inclusive)
        WHEN SUBSTRING(@input,3,1) NOT LIKE '%[0123456789]%' THEN 'failure' --third character must be a natural number (zero inclusive)
        ELSE 'success'
    END
    RETURN @output
END

我有以下查询,其中我尝试返回某个列传递给UDF时失败的记录:

SELECT
Col1
FROM some_table
WHERE
dbo.test8(Col2) = 'failure'

我有几条记录可以带来成功&#39;在这个UDF上(例如,&#39; 123&#39;),但它们在查询中返回,这意味着UDF正在返回&#39;失败&#39;在他们。我的查询有什么问题?我最好的猜测是它与SUBSTRINGs有关。

1 个答案:

答案 0 :(得分:2)

如果未指定(n)varchar参数的大小,则默认长度为1个字符。

更改

CREATE FUNCTION [dbo].[test8] (@input nvarchar)

CREATE FUNCTION [dbo].[test8] (@input nvarchar(4))