我有一个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子句运行正常。任何人都可以帮助我让未评论的线路工作吗?
答案 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)