2008-12-23 85 views
23

我有一个存储过程(MSSQL 2K5),将采取一个变量的LIKE圣诞老人像这样使用变量:在SQL 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子句运行得很好。任何人都可以帮助我得到未评论的行工作?

回答

14

Joel是不是已经声明了@SearchLetter?同样,@ SearchLetter2的长度对于't%'来说不够长。尝试更长的varchar。

3

DECLARE @ SearchLetter2 char(1)

将此设置为更长的字符。

3

这对我的作品在罗斯文示例数据库,注意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' 
1

我们也可以直接写...

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' 

这些都将工作

50

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

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

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

感谢。它为我工作 – Goldfish 2017-08-26 18:16:12

1

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

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

如果我们已经有了表“名称”例如像[Test1..Test200]和我们声明CHAR(5)中选择,如:

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

结果将是唯一的 - “测试1” ! (char(5) - 长度为5个字符; Test11为6)

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

没关系,如果我们想通过这种方式来限制SELECT。 但是,如果这不是有意的做法,它可能会返回来自计划的 的错误结果(如“所有名称始于Test1 ...”)。

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

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

这将返回(Test1的同时也Test11..Test19和Test100 ..Test199)。

5

像安德鲁·布劳尔,但增加了装饰

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

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