Czy próbowałeś go uruchomić ponownie? Podejrzewam, że wezwanie do dyrektora jest teraz częścią twojej procedury. A co powiesz na:
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%';
Kilka innych sugestii, o których nie wypadałoby nie wspomnieć:
- Podczas tworzenia i wywoływania obiektów należy zawsze określić prefiks schematu. Więc
CREATE PROCEDURE dbo.wildcard_name
,EXEC dbo.wildcard_name
itp. - Mam nadzieję, że Twój kod produkcyjny nie używa
SELECT *
. - Gorąco polecam używanie nvarchar zamiast nchar dla swojego parametru.
- Owiń treść procedury za pomocą
BEGIN
/END
i nie bój się używać wcięć, aby uczynić go bardziej czytelnym. - Zazwyczaj będziesz chciał użyć
SET NOCOUNT ON;
aby zapobiec wpływowin row(s) affected
wiadomości od zakłócania wyników. NVARCHAR
parametry powinny mieć przedrostek N (chociaż jestem zdezorientowany, dlaczego naprzemiennie używaszvarchar
inchar
po pierwsze - są to dwie zmiany, w których spodziewałbym się zera).- W zależności od sortowania (i tego, czy wyszukiwanie ma uwzględniać wielkość liter), może być konieczna zmiana klauzuli where za pomocą
COLLATE
klauzula.
EDYTUJ wydaje mi się, że to działa dobrze, więc proszę wyjaśnij, co robisz inaczej (i czy „nie działa” nadal oznacza pusty wynik, czy coś innego?):