Hast du es nochmal versucht laufen zu lassen? Ich vermute, dass der Exec-Aufruf jetzt Teil des Hauptteils Ihrer Prozedur ist. Wie wäre es mit:
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%';
Haufen anderer Vorschläge, die ich nicht erwähnen würde:
- Sie sollten beim Erstellen und Aufrufen von Objekten immer das Schemapräfix angeben. Also
CREATE PROCEDURE dbo.wildcard_name
,EXEC dbo.wildcard_name
usw. - Hoffentlich verwendet Ihr Produktionscode nicht
SELECT *
. - Empfehlen Sie dringend, nvarchar anstelle von nchar für Ihren Parameter zu verwenden.
- Umschließen Sie Ihren Prozedurrumpf mit
BEGIN
/END
und scheuen Sie sich nicht, Einzüge zu verwenden, um die Lesbarkeit zu verbessern. - Normalerweise sollten Sie
SET NOCOUNT ON;
verwenden um zu verhindern, dassn row(s) affected
Nachrichten, die Ihre Ergebnisse beeinträchtigen. NVARCHAR
Parameter sollten ein N-Präfix haben (obwohl ich verwirrt bin, warum Sie zwischenvarchar
wechseln undnchar
an erster Stelle - das sind zwei Schichten, wo ich null erwarten würde).- Abhängig von der Sortierung (und davon, ob bei der Suche zwischen Groß- und Kleinschreibung unterschieden werden soll) müssen Sie möglicherweise Ihre Where-Klausel mithilfe von
COLLATE
ändern Klausel.
BEARBEITEN das scheint für mich gut zu funktionieren, also erklären Sie bitte, was Sie anders machen (und bedeutet "funktionierte nicht" immer noch ein leeres Ergebnis oder etwas anderes?):