【问题标题】:SQL Server LIKE with square brackets works directly but not using variable带方括号的 SQL Server LIKE 直接工作,但不使用变量
【发布时间】:2021-02-05 12:01:06
【问题描述】:

我使用方括号来表示一系列通配符。 奇怪的是,直接在语句中使用表达式可以正常工作,获取预期的行。但是从变量中使用相同的表达式不会带来任何结果。 为什么它不能从变量中工作?

作品:

SELECT * FROM dbo.Table WHERE Column LIKE '%B[A-Z][A-Z]%';
Results: BAA, BAB, BAC, ... until BZZ

不工作:

DECLARE @var VARCHAR(10)
SET @var = N'B[A-Z][A-Z]'
SELECT * FROM dbo.Table WHERE Column LIKE CONCAT('%', @var, '%');

我也尝试与 + 连接,但结果仍然为零(LIKE '%' + @var + '%')

当我在变量中只使用一个范围时,相同的表达式有效,但我确实需要使用两个范围

SET @var = N'B[A-Z]'
SELECT * FROM dbo.Table WHERE Column LIKE '%' + @var + '%';
Results: BA, BB, BC, BD, ....

【问题讨论】:

  • 您的代码运行良好:dbfiddle.uk/….
  • 你的变量对于模式来说不够长,所以它被截断了
  • 谢谢@cf_en。这就是问题所在!我不明白为什么 Management Studio 没有通知截断
  • 因为据记载它会截断值 @2k.silvio 。来自Converting Character Data“当字符表达式转换为不同大小的字符数据类型时,对于新数据类型来说太长的值将被截断。”您正在转换varchar(11)varchar(10),因此该值被截断。

标签: sql sql-server sql-like


【解决方案1】:

使您的变量更长,以便它可以存储整个模式。您可以使用PRINT @var 查看变量的实际值,这将显示右方括号已被删除。

declare @var varchar(10) = 'B[A-Z][A-Z]'
print @var

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多