sql >> Base de Datos >  >> RDS >> Sqlserver

procedimiento almacenado con parámetros comodín

¿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 / END y no tenga miedo de usar sangría para que sea mucho más legible.
  • Por lo general, querrá usar SET NOCOUNT ON; para evitar que n row(s) affected mensajes de interferir con sus resultados.
  • NVARCHAR los parámetros deben tener un prefijo N (aunque estoy confundido por qué está alternando entre varchar y nchar en 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 COLLATE clá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?):