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êchern 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 entrevarchar
etnchar
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 ?):