Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

stored procedure con parametri jolly

Hai provato a eseguirlo di nuovo? Sospetto che la chiamata exec faccia parte del corpo della tua procedura ora. Che ne dici di:

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 mucchio di altri suggerimenti che sarei negligente a non menzionare:

  • Dovresti sempre specificare il prefisso dello schema durante la creazione e la chiamata di oggetti. Quindi CREATE PROCEDURE dbo.wildcard_name , EXEC dbo.wildcard_name , ecc.
  • Speriamo che il tuo codice di produzione non utilizzi SELECT * .
  • Consiglio vivamente di usare nvarchar invece di nchar per il tuo parametro.
  • Avvolgi il corpo della procedura con BEGIN / END e non aver paura di usare il rientro per renderlo molto più leggibile.
  • Di solito vorrai usare SET NOCOUNT ON; per evitare che n row(s) affected messaggi dall'interferenza con i tuoi risultati.
  • NVARCHAR i parametri dovrebbero avere un prefisso N (anche se sono confuso perché stai alternando varchar e nchar in primo luogo - si tratta di due turni in cui mi aspetterei zero).
  • A seconda delle regole di confronto (e se desideri che la ricerca faccia distinzione tra maiuscole e minuscole), potrebbe essere necessario modificare la clausola where utilizzando COLLATE clausola.

MODIFICA questo sembra funzionare bene per me, quindi per favore spiega cosa stai facendo in modo diverso (e "non ha funzionato" significa ancora risultato vuoto o qualcos'altro?):