2014-09-04 80 views
0

在功能我想检查传入的值是否等于预定值(@ValX)
我已经写了以下功能:
比较两个nvarchar的一个函数

ALTER Function IsNotInReview(@Val NVARCHAR(MAX)) 
RETURNS BIT 
AS 
BEGIN 
    DECLARE @ValX NVARCHAR(MAX) 
    SET @ValX = ' 
{ 
"httpCode" : 200, 
"message" : "OK", 
"result" : { 
    "items" : { 
    "items" : [ ] 
    } 
} 
} 
    ' 

    IF LTRIM(RTRIM(@Val)) = LTRIM(RTRIM(@ValX)) 
    BEGIN 
     RETURN 1 
    END 
    ELSE 
    BEGIN 
     RETURN 0 
    END 
    RETURN 0 

END 

当我测试调用功能,我总是得到错误的值

SELECT dbo.IsNotInReview(' 
{ 
"httpCode" : 200, 
"message" : "OK", 
"result" : { 
    "items" : { 
    "items" : [ ] 
    } 
} 
} 
')--should return true 

SELECT dbo.IsNotInReview('test') 

UPDATE

我已经更新了我的SP,但仍然获得相同的'假'返回值

ALTER Function IsNotInReview(@Val NVARCHAR(MAX)) 
RETURNS BIT 
AS 
BEGIN 
    DECLARE @ValX NVARCHAR(MAX) 
    SET @ValX = ' 
{ 
"httpCode" : 200, 
"message" : "OK", 
"result" : { 
    "items" : { 
    "items" : [ ] 
    } 
} 
} 
    ' 

    DECLARE @ReturnVal BIT 

    IF LTRIM(RTRIM(@Val)) = LTRIM(RTRIM(@ValX)) 
    BEGIN 
     SET @ReturnVal = 1 
    END 
    ELSE 
    BEGIN 
     SET @ReturnVal = 0 
    END 
    RETURN @ReturnVal 

END 



SELECT dbo.IsNotInReview('{ 
    "httpCode" : 200, 
    "message" : "OK", 
    "result" : { 
    "items" : { 
     "items" : [ ] 
    } 
    } 
}') --Return false which is unexpected 
+1

改变你如果'IF LTRIM(RTRIM(@val))= LTRIM(RTRIM(@ValX)) RETURN 1 ELSE \t返回0 \t回1' – 2014-09-04 05:16:03

+0

我复制你的代码在我的数据库,可以看到它返回 '1' 的预期。 – Maas 2014-09-04 05:17:50

+1

尝试从你的功能伙伴中删除最后一个RETURN 0;) – Farrokh 2014-09-04 05:41:39

回答

1

您没有比较相同的字符串。看看缩进。我无法想象这就是你的意图,即不仅要比较相关内容,还要比较缩进。

可能的解决方案是删除字符串中的所有空格,换行符等,同时跳过用双引号括起来的部分。

编辑:这是一个可能对你有用的小函数。它在跳过引用区域的同时从字符串中删除空格。请测试彻底,我只写了它,testet有点(我得去上班)

create function RemoveWhiteSpaces (@String nvarchar(max)) 
returns nvarchar(max) 
as 
begin 
declare @result nvarchar(max), @i int, @n int, @inQuotes bit, 
declar @c0 nchar(1), @c nchar(1) 

    set @i=1 
    set @n=len(@string) 
    set @result='' 
    set @inQuotes=0 
    set @c='x' 

    while @i <= @n begin 
    set @[email protected] 
    set @c=substring(@string,@i,1) 
    if @c='"' and @c0 != '\' 
     set @inQuotes= 1 - @inQuotes 

    if @inQuotes = 1 or 
     (@inQuotes = 0 and @c not in (' ',char(13), char(10),char(8))) 
     set @result = @result + @c 

    set @[email protected]+1 
    end 
    return @result 
end