多条件判断的存储过程?怎么实现? 急啊!!!

spring0906 2009-03-13 09:44:27
我表结构如下:
IF EXISTS (SELECT * FROM sysobjects WHERE [NAME]='Employees')
DROP TABLE Employees
/********************************************************************************
--
--Action:创建员工信息表(Employees)
--Author:123
--Create-Date:2009-3-13
*********************************************************************************/
CREATE TABLE Employees
(
[Id] int IDENTITY(1,1) CONSTRAINT PK_EE_Id PRIMARY KEY([Id]) not null, --员工信息主键列,自动标识主键列
E_no nvarchar(20) not null, --员工身份编号
E_name nvarchar(20) not null, --员工名称
E_six varchar(10) not null, --员工性别
E_Did int CONSTRAINT FK_E_DId FOREIGN KEY(E_DId) REFERENCES Depts([Id]) not null, --员工部门编号,Depts表[Id]的编号
E_born Datetime not null, --员工出生年月
E_native nvarchar(100)null, --员工籍贯
E_address nvarchar(100) null, --员工现住地址
E_email nvarchar(20) null, --员工Email
E_phone nvarchar(30) null, --联系电话,多个电话“;”号隔开
E_telphone nvarchar(30) null, --联系人移动电话,多个电话用“;”号隔开
E_qq nvarchar(15) null, --员工QQ
E_datetime datetime not null, --员工入职日期
E_picpath nvarchar(30) null, --员工相片路径
E_work nvarchar(30) null, --员工职位
E_login nvarchar(20) not null, --员工账号
E_pwd nvarchar(20) not null, --员工密码
E_Rid int CONSTRAINT FK_E_RId FOREIGN KEY(E_RId) REFERENCES Roles([Id])not null,--员工权限编号,Roles表[Id]的外键
E_remark nvarchar(200) null, --备注

)


我要实现根据
E_no、E_name、E_Did、E_work、E_Rid 这5个条件来查询,

我的存储过程这样写的:
-------------------------------------------------------------------------------------------
IF EXISTS( SELECT * FROM sysobjects WHERE name='employees_select_SQL_proc' )
DROP PROCEDURE employees_select_SQL_proc
GO
/******************************************************************
--
--action:根据查询条件查询符合条件的员工信息
--author:
--create-date:2009-3-12
--parameter:@name 员工名称
--parameter:@did 部门编号
--parameter:@work 职位
--parameter:@rid 角色编号
--
*************************************************************************/
CREATE PROCEDURE employees_select_SQL_proc
@name nvarchar(20),
@did nvarchar(3),
@work nvarchar(10),
@rid nvarchar(3)
AS
DECLARE @sql nvarchar(1000)
SET @sql='SELECT * FROM employees WHERE 1=1'
IF(@name IS NOT NULL)
BEGIN
SET @sql=@sql+'AND E_name LIKE ''%'+@name+'%'' '
END
IF(@did IS NOT NULL)
BEGIN
SET @sql=@sql+'AND E_Did ='''+CONVERT(int,@did)+''''
END
IF(@work IS NOT NULL)
BEGIN
SET @sql=@sql+' AND E_work LIKE ''%'+@work+'%'' '
END
IF(@rid IS NOT NULL)
BEGIN
SET @sql=@sql+'AND E_Rid ='''+CONVERT(int,@rid)+''''
END
EXEC(@sql)
GO
-------------------------------------------------------------------------------------------

但是有问题,不知道怎么修改?谁能帮帮忙啊?急用啊?
...全文
550 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ks_reny 2009-03-13
  • 打赏
  • 举报
回复
用 print(@sql) 看一下你最後的SQL語句是否正確.
lovemi99 2009-03-13
  • 打赏
  • 举报
回复
前面写错了,重写一遍:)
试试下面的代码:
CREATE PROCEDURE employees_select_SQL_proc
@name nvarchar(20),
@did nvarchar(3),
@work nvarchar(10),
@rid nvarchar(3)
AS
DECLARE @sql nvarchar(1000)
SET @sql='SELECT * FROM employees WHERE 1=1'
IF(@name IS NOT NULL)
BEGIN
SET @sql=@sql+' AND E_name LIKE ''%'+@name+'%'' '
END
IF(@did IS NOT NULL)
BEGIN
SET @sql=@sql+' AND E_Did ='+@did
END
IF(@work IS NOT NULL)
BEGIN
SET @sql=@sql+' AND E_work LIKE ''%'+@work+'%'' '
END
IF(@rid IS NOT NULL)
BEGIN
SET @sql=@sql+' AND E_Rid ='+@rid
END
EXEC(@sql)
GO
yygyogfny 2009-03-13
  • 打赏
  • 举报
回复
先把你的错误信息贴出来
lovemi99 2009-03-13
  • 打赏
  • 举报
回复
试试下面的代码:
CREATE PROCEDURE employees_select_SQL_proc
@name nvarchar(20),
@did nvarchar(3),
@work nvarchar(10),
@rid nvarchar(3)
AS
DECLARE @sql nvarchar(1000)
SET @sql='SELECT * FROM employees WHERE 1=1'
IF(@name IS NOT NULL)
BEGIN
SET @sql=@sql+' AND E_name LIKE ''%'+@name+'%'' '
END
IF(@did IS NOT NULL)
BEGIN
SET @sql=@sql+' AND E_Did ='+CONVERT(int,@did)+''
END
IF(@work IS NOT NULL)
BEGIN
SET @sql=@sql+' AND E_work LIKE ''%'+@work+'%'' '
END
IF(@rid IS NOT NULL)
BEGIN
SET @sql=@sql+' AND E_Rid ='+CONVERT(int,@rid)+''
END
EXEC(@sql)
GO
cnljx_8485 2009-03-13
  • 打赏
  • 举报
回复
nvarchar可能不允许显示转换成int类型,但可以隐式转换,方法应该就是3楼那种,要显示或者强制,可能不允许,看看SQL的联机丛书吧,解释还比较清楚,而且还有张各数据类型转换表,可以看下。
另外,联机丛书中有这么句原话,参考一下吧:
“当将非数字类型的 char、nchar、varchar 或 nvarchar 数据转换为 int、float、numeric 或 decimal 时,SQL Server 将返回错误信息。”
具体位置可以用CONVERT关键字在丛书中搜
spring0906 2009-03-13
  • 打赏
  • 举报
回复
1楼的和我那个的错误一样的,错误是:
服务器: 消息 245,级别 16,状态 1,过程 employees_select_SQL_proc,行 26
将 nvarchar 值 'SELECT * FROM employees WHERE 1=1 AND E_name LIKE '%as%' AND E_Did =' 转换为数据类型为 int 的列时发生语法错误。

3楼的没错,但是,如果我要转换成INT 类型的数据,怎么弄呢?
spring0906 2009-03-13
  • 打赏
  • 举报
回复
恩,我试试

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧