2014-09-04 77 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