¿Intentaste ejecutarlo de nuevo? Sospecho que la llamada ejecutiva es parte del cuerpo de su procedimiento ahora. ¿Qué 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%';
Un montón de otras sugerencias que sería negligente no mencionar:
- Siempre debe especificar el prefijo del esquema al crear y llamar objetos. Así que
CREATE PROCEDURE dbo.wildcard_name,EXEC dbo.wildcard_name, etc. - Con suerte, su código de producción no usa
SELECT *. - Recomiendo encarecidamente usar nvarchar en lugar de nchar para su parámetro.
- Envuelva el cuerpo de su procedimiento con
BEGIN/ENDy no tenga miedo de usar sangría para que sea mucho más legible. - Por lo general, querrá usar
SET NOCOUNT ON;para evitar quen row(s) affectedmensajes de interferir con sus resultados. NVARCHARlos parámetros deben tener un prefijo N (aunque estoy confundido por qué está alternando entrevarcharyncharen primer lugar, son dos turnos en los que esperaría cero).- Dependiendo de la intercalación (y si desea que la búsqueda distinga entre mayúsculas y minúsculas), es posible que deba cambiar su cláusula where usando
COLLATEcláusula.
EDITAR esto parece funcionar bien para mí, así que explique qué está haciendo de manera diferente (¿y "no funcionó" todavía significa un resultado vacío, o algo más?):
