Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

gespeicherte Prozedur mit Platzhalterparametern

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, dass n row(s) affected Nachrichten, die Ihre Ergebnisse beeinträchtigen.
  • NVARCHAR Parameter sollten ein N-Präfix haben (obwohl ich verwirrt bin, warum Sie zwischen varchar wechseln und nchar 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?):