2008-12-23 7 views
23

J'ai un sproc (MSSQL 2k5) qui prendra une variable pour une claus comme comme si:Utiliser la variable dans l'instruction 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] 

Malheureusement, la ligne en cours d'exécution génère une erreur de syntaxe, alors que la clause where commentée fonctionne très bien. Quelqu'un peut-il me aider à obtenir la ligne non commenté travail?

Répondre

14

Joel est-ce que @SearchLetter n'a pas été déclarée encore? De plus la longueur de @ SearchLetter2 est pas assez long pour 't%. Essayez un varchar d'une longueur plus longue.

3

DECLARE @ SearchLetter2 omble chevalier (1)

Réglez ce paramètre à une plus omble chevalier.

3

Cela fonctionne pour moi sur l'exemple Northwind DB, notez que SearchLetter dispose de 2 caractères et SearchLetter doit également être déclaré pour que cela fonctionne:

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

Nous pouvons écrire directement aussi ...

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' 

SELECT * 
FROM CUSTOMERS 
WHERE CONTACTNAME LIKE @SearchLetter + '%' 
     AND REGION = 'WY' 

ou de la manière suivante et si nous devons ajouter tous les caractères de recherche, puis,

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' + '%' 

SELECT * 
FROM CUSTOMERS 
WHERE CONTACTNAME LIKE @SearchLetter 
     AND REGION = 'WY' 

Ces deux travailleront

50

Si vous utilisez une procédure stockée:

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

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

Merci. Ça a marché pour moi – Goldfish

1

Mais à mon avis, une chose importante.

Le "char (nombre)" il est de longueur variable.

Si nous avons table avec des "noms" comme par exemple [Test1..Test200] et nous déclarons char (5) SELECT comme:

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

le résultat sera seulement - "Test1" ! (char (5) - 5 caractères en longueur, Test11 est 6)

Le reste des données potentiellement intéressées comme [Test11..Test200] ne sera pas retourné dans le résultat.

Il est ok si nous voulons limiter le SELECT de cette façon. Mais si ce n'est pas intentionnel façon de le faire pourrait retourner des résultats incorrects de prévu (comme « tous les noms commençant avec ... Test1 »).

À mon avis, si nous ne savons pas la précision longueur d'une valeur choisie, une meilleure solution pourrait être quelque chose comme celui-ci:

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

Ce rendement (mais aussi Test11..Test19 Test1 et Test100 ..Test199).

5

Comme Andrew Brower, mais en ajoutant une garniture

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

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