6

我试图通过确保变量的值以括号“[”为前缀来错误地捕获 T-SQL 变量名。

这是我如何尝试执行此操作的示例:

DECLARE @thing nvarchar(20)
SET @thing = '[55555'
IF(@thing NOT LIKE '[' + '%') --If the value does not start with [ then add it
BEGIN
SET @thing = '[' + @thing
END
PRINT @thing

上面的例子 PRINT 的[[55555

请注意,@thing 的原始值以括号“[”为前缀。我原以为 IF 条件会返回 false,因为"[55555" is LIKE '[' + '%'

为什么 IF 条件不返回 false?而且,更重要的是,我想,检查在变量字符串值开头出现的字符串是否存在的正确语法是什么?

编辑 它似乎是因为括号“[”有一些特别之处。当我在支架上运行 LIKE 时,它并没有达到我的预期,但是当我不使用支架时,LIKE 按我预期的方式工作。

看看这些例子:

IF('[' NOT LIKE '[')
BEGIN
PRINT '[ is NOT LIKE ['
END
ELSE
BEGIN
PRINT '[ is LIKE ['
END

IF('StackO' NOT LIKE 'StackO')
BEGIN
PRINT 'STACKO is NOT LIKE StackO'
END
ELSE
BEGIN
PRINT 'STACKO is LIKE StackO'
END

这是两个条件的输出:

[ 不像 [

STACKO 就像 StackO

4

4 回答 4

5

我相信这可能是因为 '[' 实际上是 LIKE 运算符语法的一部分,如此处定义:http: //msdn.microsoft.com/en-us/library/ms179859.aspx

您需要定义一个转义字符来转义 [,如下所示:

DECLARE @thing nvarchar(20)
SET @thing = '[55555'
IF(@thing NOT LIKE '\[%' ESCAPE '\' )
BEGIN
SET @thing = '[' + @thing
END
PRINT @thing

另一种解决方案如下:

DECLARE @thing nvarchar(20)
SET @thing = '[55555'
IF(LEFT(@thing,1) <> '[') --If the value does not start with [ then add it
BEGIN
SET @thing = '[' + @thing
END
PRINT @thing
于 2011-07-22T23:48:07.103 回答
2

为了让它正常工作,请将您的支票更改为

IF (SUBSTRING(@thing, 1,1) != '[')

like 不起作用的原因是因为 [ 是 like 中的特殊字符。就像 % 一样。看这里

于 2011-07-22T23:47:55.093 回答
2

括号字符 ([])是 T-SQL 中的特殊通配符。要搜索这些文字字符,您需要转义这些字符(表明您要搜索这些文字字符,而不是将它们用作通配符)。用于ESCAPE执行此操作,如下所示:

DECLARE @thing nvarchar(20)
SET @thing = '[55555'
-- pick an escape character you won't see in your content
IF(@thing NOT LIKE '![' + '%' ESCAPE '!')
BEGIN
  SET @thing = '[' + @thing
END
PRINT @thing

这打印[55555

来自MSDN

您可以搜索包含一个或多个特殊通配符的字符串... 要将百分号作为字符而不是通配符进行搜索,必须提供 ESCAPE 关键字和转义字符。例如,一个示例数据库包含一个名为的列comment,其中包含 text 30%。要搜索列中任意位置包含字符串的任何行30%,请comment指定 WHERE 子句,例如WHERE comment LIKE '%30!%%' ESCAPE '!'.

于 2011-07-22T23:55:47.750 回答
0

您必须转义特殊字符(括号、单引号等)。在这种情况下,您可以这样做:

LIKE '[['

编辑:

PS -- [ 是一个特殊字符,因为它可以用于通配符,例如:LIKE '[0-9]'进行模式匹配。(在这种情况下,匹配就像一个正则表达式 - 0 到 9 之间的任何数字。

于 2011-07-22T23:59:32.413 回答