带有通配符参数的存储过程

时间:2012-05-15 13:05:27

标签: sql-server-2005 stored-procedures

我有一张桌子

create table user (userId varchar(8) not null, userName varchar(8) not null)
   insert into user
     select 'NAME1','name1'
     union all
     select 'NAME2', 'name2'
     union all
     select 'NAME3','name3'

我使用存储过程作为通配符参数:

create procedure wildcard_name
@userName nchar(8)=  '%'
as
select * from user
where userName like @userName;

exec wildcard_name 'n%';

exec语句没有给出任何结果,为什么?

1 个答案:

答案 0 :(得分:3)

你有没有尝试再次运行它?我怀疑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_nameEXEC dbo.wildcard_name
  • 希望您的生产代码不使用SELECT *
  • 强烈建议您使用nvarchar而不是nchar作为参数。
  • 使用BEGIN / END包裹您的程序正文,并且不要害怕使用缩进来使其更具可读性。
  • 您通常希望使用SET NOCOUNT ON;来阻止n row(s) affected条消息干扰您的搜索结果。
  • NVARCHAR参数应该有一个N前缀(虽然我很困惑,为什么你首先在varcharnchar之间交替 - 这是两个班次我在哪里期待零)。
  • 根据排序规则(以及您是否希望搜索区分大小写),您可能需要使用COLLATE子句更改where子句。

编辑这对我来说似乎运作得很好,所以请解释一下你做的不同(并且“不起作用”仍然意味着空结果或其他什么?):

enter image description here