2008-12-23 12 views
23

Tengo un procedimiento almacenado (2k5 MSSQL), que tendrá una variable para un Noel tiene gusto de este modo:variable en instrucción SQL COMO

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] 

Desafortunadamente, la línea que actualmente genera un error de sintaxis, mientras la cláusula comentada donde funciona bien. ¿Alguien puede ayudarme a hacer funcionar la línea no comentada?

Respuesta

14

¿Joel es que @SearchLetter aún no ha sido declarado? Además, la longitud de @ SearchLetter2 no es lo suficientemente larga para 't%'. Pruebe con un varchar de mayor longitud.

3

DECLARE @ carbón SearchLetter2 (1)

Establecer esto a un char más tiempo.

3

Esto funciona para mí en la muestra DB Neptuno, tenga en cuenta que SearchLetter tiene 2 personajes a la misma y SearchLetter también tiene que ser declarado para esto para ejecutar:

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

Nos puede escribir directamente también ...

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' 

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

o la siguiente manera también si hay que anexar todos los caracteres de búsqueda a continuación,

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' + '%' 

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

Ambos trabajarán

50

Si está utilizando un procedimiento almacenado:

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

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

Gracias. Esto ha funcionado para mí – Goldfish

1

Pero en mi opinión, una cosa importante.

El "char (número)" es la longitud de la variable.

Si tenemos mesa con "nombres", como por ejemplo [Test1..Test200] y declaramos char (5) en SELECT como:

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

el resultado será solamente - "Prueba1" ! (char (5) - 5 caracteres de longitud; Test11 es 6)

El resto de posibles datos de interés como [Test11..Test200] no se devolverán en el resultado.

Está bien si queremos limitar el SELECCIONAR de esta forma. Pero si no es una forma intencional de hacerlo, podría devolver resultados incorrectos del plan (como "todos los nombres que comienzan con Test1 ...").

En mi opinión, si no sabemos la longitud exacta de un valor seleccionado, una mejor solución podría ser algo como esto:

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

Esto devuelve (Prueba1 sino también Test11..Test19 y Test100 ..Test199).

5

Como Andrés Brower pero añadiendo un ajuste

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

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