Опитахте ли да го стартирате отново? Подозирам, че извикването на exec сега е част от тялото на вашата процедура. Какво ще кажете за:
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%';
Куп други предложения, които би било небрежно да не спомена:
- Винаги трябва да указвате префикса на схемата, когато създавате и извиквате обекти. Така че
CREATE PROCEDURE dbo.wildcard_name
,EXEC dbo.wildcard_name
и т.н. - Надяваме се, че производственият ви код не използва
SELECT *
. - Силно препоръчваме да използвате nvarchar вместо nchar за вашия параметър.
- Обвийте тялото на вашата процедура с
BEGIN
/END
и не се страхувайте да използвате отстъп, за да го направите много по-четлив. - Обикновено ще искате да използвате
SET NOCOUNT ON;
за предотвратяване наn row(s) affected
съобщения от намеса във вашите резултати. NVARCHAR
параметрите трябва да имат префикс N (въпреки че съм объркан защо редуватеvarchar
иnchar
на първо място - това са две смени, където бих очаквал нула).- В зависимост от сортирането (и дали искате търсенето да е чувствително към главни и малки букви), може да се наложи да промените вашата клауза where с помощта на
COLLATE
клауза.
РЕДАКТИРАНЕ това изглежда работи добре за мен, така че, моля, обяснете какво правите по различен начин (и "не работи" все още ли означава празен резултат или нещо друго?):