在 SQLLike 语句中使用变量

我有一个 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 子句运行得很好。有人能帮我把未注释的线路修好吗?

280130 次浏览

乔尔,是不是这个“搜索字母”还没有被申报?此外,@SearchLetter2的长度对于“ t%”也不够长。试试长度更长的 varchar。

DECLARE@SearchLetter2 char (1)

将其设置为更长的 char。

这对于 Northwind 示例 DB 很有用,请注意 SearchLetters 有2个字符,并且 SearchLetters 也必须声明才能运行:

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

我们也可以直接写..。

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'

这两个都可以

如果您正在使用存储过程:

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


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

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

“ char (number)”是变量的长度。

如果我们有一个带有“ Names”的表,比如[ 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开头的所有名称...”)。

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

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

这将返回(Test1,但也包括 Test11. . Test19和 Test100. . Test199)。

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

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


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

它可能就像 LIKE '%%[%3]%%'作为输入变量 [%3]一样简单。

我用 SAP B19.1就可以了

在 LIKE 中使用局部变量也有问题。
重要的是要知道: 变量有多长
下面,没有50字符长,所以不能使用: 就像@Order _ NO,因为最后将是空格。
您需要首先修剪变量的右侧。
像这样:

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


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

我也遇到过类似的问题。我只需要使用保存在我的数据库中的一个 URL 的一小部分,前面和结尾都是不相关的。

我第一次尝试使用:

DECLARE @variable VARCHAR(250) = %x%;
SELECT * FROM tblone WHERE column1 LIKE '@variable'

但是,这会返回错误:

将数字转换为数据类型 varchar 的算术溢出错误

我的工作查询是格式化的:

DECLARE @variable VARCHAR(1000) = x;
SELECT * FROM tblone WHERE column1 LIKE '%'+@variable+'%'