请教一个存储过程+wildcard的疑问
本帖最后由 suanleba10 于 2013-08-20 11:49:07 编辑
proc:
create proc proc_default_var
@Id varchar(10)='%',
@Sex varchar(10)='%'
as
select * from Customer
where CustomerId=@Id and Sex=@Se
exec:
#1 exec proc_default_var 'aa', 'male'
#2 exec proc_default_var '14', 'male'
执行exec下的sql语句#1后报错
Conversion failed when converting the varchar value 'aa' to data type int.
执行exec下的sql语句#2后正常
但是,
在stored_proc里@Id定义的是‘varchar'类型。
提问:
1)这种通配符@Id varchar(10)='%',一定是varchar类型? 如果建表时定义的@Id是int类型,也可以匹配到?
2) 在proc里定义了@Id varchar(10)='%',如果建表时定义的是@Id int,为什么执行时给@Id赋值为int类型就能正确执行,而赋值为varchar类型则出现类型不匹配的问题?
types of table's elems
create table Customer
(
CustomerID int not null primary key,
CustomerName varchar(10),
Sex varchar(10)
)
------解决方案--------------------补充下,上面的#1中说:如果字段是其它类型,系统会试着转换为字符类型去比较。不妥。
应该说:系统会根据左右两边数据类型的优先级进行转换。但数据类型的转换往往伴随着效率问题及BUG的产生。所以建议存储过程中的参数类型,一定要定义成和字段类型一模一样。参考版主的博文:
http://blog.csdn.net/dba_huangzj/article/details/7883090