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 quen 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 entrevarchar
enchar
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?):