2

我有一张桌子

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 语句没有给出任何结果,为什么?

4

1 回答 1

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

编辑这对我来说似乎工作得很好,所以请解释你在做什么不同(并且“没有工作”仍然意味着空结果,还是其他什么?):

在此处输入图像描述

于 2012-05-15T13:07:12.177 回答