Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

procédure stockée avec des paramètres génériques

Avez-vous essayé de l'exécuter à nouveau ? Je soupçonne que l'appel exec fait maintenant partie du corps de votre procédure. Que diriez-vous :

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 tas d'autres suggestions que je m'en voudrais de ne pas mentionner :

  • Vous devez toujours spécifier le préfixe du schéma lors de la création et de l'appel d'objets. Donc CREATE PROCEDURE dbo.wildcard_name , EXEC dbo.wildcard_name , etc.
  • J'espère que votre code de production n'utilise pas SELECT * .
  • Recommande fortement d'utiliser nvarchar au lieu de nchar pour votre paramètre.
  • Enveloppez le corps de votre procédure avec BEGIN / END et n'ayez pas peur d'utiliser l'indentation pour le rendre beaucoup plus lisible.
  • Vous voudrez généralement utiliser SET NOCOUNT ON; pour empêcher n row(s) affected messages d'interférer avec vos résultats.
  • NVARCHAR les paramètres doivent avoir un préfixe N (bien que je ne sache pas pourquoi vous alternez entre varchar et nchar en premier lieu - il s'agit de deux quarts de travail où je m'attendrais à zéro).
  • Selon le classement (et si vous souhaitez que la recherche soit sensible à la casse), vous devrez peut-être modifier votre clause where à l'aide de COLLATE clause.

MODIFIER cela semble fonctionner très bien pour moi, alors s'il vous plaît expliquez ce que vous faites différemment (et est-ce que "n'a pas fonctionné" signifie toujours un résultat vide, ou autre chose ?):