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/ENDet 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) affectedmessages d'interférer avec vos résultats. NVARCHARles paramètres doivent avoir un préfixe N (bien que je ne sache pas pourquoi vous alternez entrevarcharetncharen 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
COLLATEclause.
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 ?):
