我正在使用SQL Server 2008
,我有以下存储过程:
ALTER PROC [dbo].[spGetLatestLangId]
@salt VARCHAR(50),
@result VARCHAR(50) OUTPUT
AS
DECLARE @CheckStr AS VARCHAR(50)
SET @CheckStr = @salt + '%'
SET @result = (SELECT TOP 1 Id FROM Lang WHERE salt LIKE @CheckStr ORDER BY dtCrt DESC)
假设我的Lang
表格有以下几行:
Id dtCrt
------------- ----------
PRODUCT_1 2011-01-01
PRODUCT_2 2011-01-02
PRODUCTCODE_1 2011-01-05
当我使用以下参数
调用存储过程时EXEC spGetLatestLangId 'PRODUCT_', @a OUTPUT
我收到PRODUCTCODE_1
而不是PRODUCT_2
,因为它忽略了underscore
。如何在underscore
子句中转义LIKE
?
答案 0 :(得分:1)
您可以使用通配符模式匹配字符作为文字字符。要将通配符用作文字字符,请将通配符括在括号中。该表显示了使用LIKE关键字和[]通配符的几个示例。
对于你的情况:
... LIKE 'PRODUCT[_]%'
答案 1 :(得分:1)
_是SQL Server中的通配符。您可以向String添加正则表达式模式。试试这个。
CREATE TABLE #temp(strings nvarchar(50))
INSERT INTO #temp(strings)
VALUES(N'PRODUCT_1'),(N'PRODUCT_2'),(N'PRODUCTCODE_1')
SELECT *
FROM #temp
WHERE strings LIKE N'PRODUCT[_]%'
DROP TABLE #temp
答案 2 :(得分:1)
如何在LIKE子句
中转义下划线
使用ESCAPE
子句:
where some_column LIKE 'X/_%' ESCAPE '/';
在你的情况下:
WHERE salt LIKE @CheckStr ESCAPE '/'
您可以将任何字符用于转义字符(例如ESCAPE '\'
或ESCAPE '@'
) - 最好使用不属于值。
但这意味着您还必须使用转义字符调用该过程:
EXEC spGetLatestLangId 'PRODUCT/_', @a OUTPUT
答案 3 :(得分:0)
在Sql server中,通过括在[]
eg:- select * from [User]
select * from [User] where name like 'John[_]%'
答案 4 :(得分:0)
我认为您需要使用:
SET @CheckStr = REPLACE(@salt, '_', '[_]') + '%'
答案 5 :(得分:0)
更改您的查询
/bin/bash
答案 6 :(得分:0)
包装
'_' -> '[_]'
ALTER PROC [dbo].[spGetLatestLangId]
@salt VARCHAR(50),
@result VARCHAR(50) OUTPUT
AS
DECLARE @CheckStr AS VARCHAR(50)
SET @CheckStr = @salt + '%'
SET @result = (SELECT TOP 1 Id FROM Lang WHERE salt LIKE REPLACE(@CheckStr,'_','[_]') ORDER BY dtCrt DESC)