Usar a variável na instrução semelhante ao SQL

eu tenho um sproc (MSSQL 2k5) que vai tomar uma variável para um tal claus como assim:

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]

infelizmente, a linha actualmente em execução lança um erro de sintaxe, enquanto que a cláusula comentada onde a cláusula é executada muito bem. Alguém me pode ajudar a pôr a linha Sem comentários a funcionar?

 28
Author: Imran Ali Khan, 2008-12-24

8 answers

Joel, será que o @SearchLetter ainda não foi declarado? Também o comprimento do @SearchLetter2 não é suficiente para't%'. Tente um varchar de comprimento maior.
 16
Author: Eric Sabine, 2008-12-23 23:39:10

Se estiver a utilizar um procedimento armazenado:

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

SELECT Name 
    FROM <table>
    WHERE Name LIKE '%' + @PartialName + '%'
 59
Author: Andrew Brower, 2012-10-01 15:56:32
Como o Andrew Brower, mas adicionando um corte.
ALTER PROCEDURE <Name>
(
    @PartialName VARCHAR(50) = NULL
)

SELECT Name 
    FROM <table>
    WHERE Name LIKE '%' + LTRIM(RTRIM(@PartialName)) + '%'
 5
Author: enraged, 2013-05-19 16:04:28

Declarar @SearchLetter2 char (1)

Coloque isto numa escala maior.

 3
Author: FlySwat, 2008-12-23 23:40:40

Isto funciona para mim na amostra de Northwind DB, note que o pesquisador tem 2 caracteres e o pesquisador também tem de ser declarado para que isto funcione:

declare @SearchLetter2 char(2)
declare @SearchLetter char(1)
Set @SearchLetter = 'A'
Set @SearchLetter2 = @SearchLetter+'%'
select * from Customers where ContactName like @SearchLetter2 and Region='WY'
 3
Author: JB King, 2008-12-23 23:41:04
Mas, na minha opinião, uma coisa importante.

O "char (número)" é o comprimento da variável.

Se temos uma mesa com "nomes" como por exemplo [Test1..Test200] e declaramos char (5) em SELECT like:

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

O resultado será apenas - "Test1"! (char (5) - 5 chars in lenght; Test11 is 6)

O resto dos potenciais dados interessados como [Test11..Test200] não será devolvido no resultado.

Não faz mal se quisermos limitar a selecção desta forma. Mas se não é uma forma intencional de o fazer pode devolver resultados incorrectos do planeado. ( Como " todos os nomes começam com o Test1..." ).

Na minha opinião, se não soubermos o valor exacto de um determinado valor, uma solução melhor poderia ser algo como esta:
DECLARE @variable varchar(max)
SET @variable = 'Test1%'
SELECT * FROM <table> WHERE variable1 like @variable

Isto devolve(Test1, mas também Test11..Ensaio 19 e ensaio 100..Test199).

 2
Author: Tomasz Wieczorkowski, 2013-05-06 20:50:16
Também podemos escrever directamente...
DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' 

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

Ou da seguinte forma, se tivermos de adicionar todos os caracteres de pesquisa, então,

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' + '%' 

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

Ambos funcionarão

 1
Author: Lively, 2012-10-20 18:14:25

Pode ser tão simples como LIKE '%%[%3]%%' ser {[1] } a variável de entrada.

Isto funciona comigo com SAP B1 9.1

 0
Author: Manuel Mendez Warren, 2018-09-27 01:36:50