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 chen row(s) affected
messaggi dall'interferenza con i tuoi risultati. NVARCHAR
i parametri dovrebbero avere un prefisso N (anche se sono confuso perché stai alternandovarchar
enchar
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?):