在SQL LIKE语句中使用变量

时间:2008-12-23 23:26:24

标签: sql-server

我有一个sproc(MSSQL 2k5),它会为LIKE克劳斯带一个变量,如下所示:

DECLARE @SearchLetter2 char(1)
SET @SearchLetter = 't'
SET @SearchLetter2 = @SearchLetter + '%'
SELECT *
    FROM BrandNames 
    WHERE [Name] LIKE @SearchLetter2 and IsVisible = 1 
    --WHERE [Name] LIKE 't%' and IsVisible = 1 
    ORDER BY [Name]

不幸的是,当前运行的行会引发语法错误,而注释的where子句运行正常。任何人都可以帮助我让未评论的线路工作吗?

9 个答案:

答案 0 :(得分:66)

如果您使用的是存储过程:

ALTER PROCEDURE <Name>
(
    @PartialName VARCHAR(50) = NULL
)

SELECT Name 
    FROM <table>
    WHERE Name LIKE '%' + @PartialName + '%'

答案 1 :(得分:18)

乔尔是不是已经宣布了@SearchLetter?此外,@ SearchLetter2的长度对于't%'来说还不够长。尝试更长的varchar。

答案 2 :(得分:10)

正如安德鲁·布劳尔所说,但增加了一个修剪

ALTER PROCEDURE <Name>
(
    @PartialName VARCHAR(50) = NULL
)

SELECT Name 
    FROM <table>
    WHERE Name LIKE '%' + LTRIM(RTRIM(@PartialName)) + '%'

答案 3 :(得分:4)

DECLARE @ SearchLetter2 char(1)

将此设置为更长的字符。

答案 4 :(得分:4)

这适用于Northwind示例数据库,请注意SearchLetter有2个字符,并且还必须声明SearchLetter才能运行:

declare @SearchLetter2 char(2)
declare @SearchLetter char(1)
Set @SearchLetter = 'A'
Set @SearchLetter2 = @SearchLetter+'%'
select * from Customers where ContactName like @SearchLetter2 and Region='WY'

答案 5 :(得分:4)

但在我看来,一件重要的事情。

“char(数字)”它是变量的长度。

如果我们有“名称”的表格,例如[Test1..Test200],我们在SELECT中声明char(5),如:

DECLARE @variable char(5)
SET @variable = 'Test1%'
SELECT * FROM table WHERE Name like @variable

结果将只是 - “Test1”! (char(5) - 长度为5个字符; Test11为6)

其他可能感兴趣的数据如[Test11..Test200]将不会在结果中返回。

如果我们想通过这种方式限制SELECT,那就没关系。 但如果不是故意的做法,可能会从计划中返回错误的结果 (比如“所有以Test1开头的名字......”)。

在我看来,如果我们不知道SELECTed值的精确长度,那么更好的解决方案可能是这样的:

DECLARE @variable varchar(max)
SET @variable = 'Test1%'
SELECT * FROM <table> WHERE variable1 like @variable

返回(Test1,还有Test11..Test19和Test100..Test199)。

答案 6 :(得分:3)

我们也可以直接写...

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' 

SELECT * 
FROM   CUSTOMERS 
WHERE  CONTACTNAME LIKE @SearchLetter + '%' 
       AND REGION = 'WY' 

或以下方式,如果我们必须附加所有搜索字符,

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' + '%' 

SELECT * 
FROM   CUSTOMERS 
WHERE  CONTACTNAME LIKE @SearchLetter 
       AND REGION = 'WY' 

这两个都可行

答案 7 :(得分:1)

它可能很简单,例如LIKE '%%[%3]%%'[%3]的输入变量。

这对我适用于SAP B1 9.1

答案 8 :(得分:0)

在LIKE中使用局部变量也遇到了问题。
重要的是要知道:可变的时间
在下面, ORDER_NO 的长度是 50 个字符,因此您不能使用: LIKE @ORDER_NO ,因为最后会出现空格。
您需要先修剪变量的右侧。
像这样:

DECLARE @ORDER_NO char(50)
SELECT @ORDER_NO = 'OR/201910/0012%'

SELECT * FROM orders WHERE ord_no LIKE RTRIM(@ORDER_NO)