在一个函数中我想检查传递的值是否等于预定义的值(@ValX)
我写了以下功能:
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')
更新
我已经更新了我的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
答案 0 :(得分:1)
您没有比较相同的字符串。看看缩进。我无法想象这就是你的意图,即不仅要比较相关内容,还要比较缩进。
一种可能的解决方案是删除字符串中的所有空格,换行符等,同时跳过用双引号括起来的部分。
编辑:这是一个可能对你有用的小功能。它会在跳过引用区域时从字符串中删除空格。请彻底测试,我只写了一下并稍微测试一下(我现在必须去上班)
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 @c0=@c
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 @i=@i+1
end
return @result
end