Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

procedimento armazenado com parâmetros curinga


Você tentou executá-lo novamente? Suspeito que a chamada do exec seja parte do corpo do seu procedimento agora. Que tal:
ALTER PROCEDURE dbo.wildcard_name
  @userName NVARCHAR(8) = '%'
AS
BEGIN
  SET NOCOUNT ON;

  SELECT userId, userName
    FROM dbo.user
    WHERE userName LIKE @userName;
END
GO -- <-- this is important! It tells SSMS that your procedure has ended!

EXEC dbo.wildcard_name N'n%';

Um monte de outras sugestões que eu seria negligente em não mencionar:
  • Você deve sempre especificar o prefixo do esquema ao criar e chamar objetos. Então CREATE PROCEDURE dbo.wildcard_name , EXEC dbo.wildcard_name , etc.
  • Esperamos que seu código de produção não use SELECT * .
  • Recomendamos usar nvarchar em vez de nchar para seu parâmetro.
  • Enrole o corpo do procedimento com BEGIN / END e não tenha medo de usar recuo para torná-lo muito mais legível.
  • Geralmente, você desejará usar SET NOCOUNT ON; para evitar que n row(s) affected mensagens interfiram em seus resultados.
  • NVARCHAR parâmetros devem ter um prefixo N (embora eu esteja confuso por que você está alternando entre varchar e nchar em primeiro lugar - são dois turnos onde eu esperaria zero).
  • Dependendo do agrupamento (e se você deseja que a pesquisa faça distinção entre maiúsculas e minúsculas), pode ser necessário alterar sua cláusula where usando o COLLATE cláusula.

EDITAR isso parece funcionar bem para mim, então, por favor, explique o que você está fazendo de maneira diferente (e "não funcionou" ainda significa resultado vazio ou outra coisa?):