2008-12-23 167 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)) + '%'