复杂的存储过程,提示未声明变量
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[KaoQinQuery]
@a varchar(1), @sql_str varchar(50)
/*
这个存储过程是专门给查询用,可以按姓名或编号或卡号进行查询
*/
as
declare @str varchar(2000)
set @str=
'select *
from
(select emp_id, card_id, case when no_sign=0 then ''否'' else ''是'' end no_sign, emp_name,id_card,
isnull(position_name,null) position_name,
case when sex=0 then ''男'' else ''女'' end sex,
isnull(job.job_name,null) job_name,
convert(varchar(10),hire_date,21) hire_date,
isnull(depart.depart_name,null) depart_name,
isnull(status.status_name,null) status_name,
isnull(polity.polity_name,null) polity_name,
isnull(native.native_name,null) native_name,
isnull(Nation.Nation_name,null) Nation_name,
isnull(Education.Education,null) Education,
isnull(dorm.dorm_name,null) dorm_name,
birth_date,
case when marriage=0 then ''未婚'' else ''已婚'' end marriage, gd_date, phone_code,
post_code, email, address, gd_school, speciality
from employee
left outer join position on employee.position_id=position.position_id--找出职称
left outer join job on employee.job_id=job.job_id
left outer join depart on employee.depart_id=depart.depart_id
left outer join Status on employee.status_id=status.status_id
left outer join polity on employee.polity_id=polity.polity_id
left outer join native on employee.native_id=native.native_id
left outer join Nation on employee.Nation_id=Nation.Nation_id
left outer join Education on employee.edu_id=Education.edu_id
left outer join Dorm on employee.dorm_id=dorm.dorm_id) query
where (emp_id like @emp_id+''%'') and (emp_name like @emp_name+''%'')'
if @a='1'
set @str=@str+'where emp_id like '''+@sql_str+'%''';
if @a='2'
set @str=@str+'where emp_name like '''+@sql_str+'%''';
exec(@str)
Go
在调用的时候:exec [KaoQinQuery] @a='1',@sql_str='1'
提示:消息 137,级别 15,状态 2,第 41 行
必须声明变量 '@emp_id'。
请问该怎样改这个存储过程,才能解决这个问题呢?请各位朋友赐教,谢谢!!!
相关推荐
浅谈MySQL存储过程中declare和set定义变量的区别
下面小编就为大家带来一篇浅谈MySQL存储过程中declare和set定义变量的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
sqlserver存储过程中SELECT 与 SET 对变量赋值的区别
SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值。当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法。下表列出 SET 与 SELECT 的区别。请特别注意红色部分。 set select 同时对多个变量同时赋值 不支持 支持 表达式返回多个值时 出错 将返回的最后一个值赋给变量 表达式未返回值 变量被赋null值 变量保持原值 下面以具体示例来说明问题:create table chinadba1(userid int ,addr varchar(128) )goinsert into chinadba1(userid,addr) v
利用try-catch判断变量是已声明未声明还是未赋值
目的是如果一个变量是已声明未赋值,就可以直接赋值;并且不能改变变量的作用域 如果未声明的话,就重新声明, 在网上搜了下,常见的方法是if(typeof(a)==’undefined’){var a=’ss’;}, 但是这种方法对未声明或已声明未赋值的变量都会返回true。而且如果是这样: 代码如下: var a; function f(){ if(typeof(a)==’undefined’) {var a=1;} } f(); console.log(a); 会显示undefined,因为f()里面只是声明了一个同名的局部变量。 但是如果是已声明未赋值的变量:if(noValueV==n
关于SQL 存储过程入门基础(变量)
上一篇我们讲到了SQL存储过程的基本定义,怎么创建,使用,这篇就来讲一下变量的使用。 变量分文局部变量和全局变量 局部变量是@开头,全局变量是@@开头,这里我们主要讲局部变量,全局变量我们后面再讲。 在c# 语言中,定义一个变量很简单,例如 代码如下:int i=0; –定义加赋值。 在sql中,定义一个变量需要关键字DECLARE,还需要个特殊符号标记(@)表示是变量。 看看简单的声明语法: 代码如下:Declare @Local_Var data_type @Local_Var是一个整体,表示一个变量。 data_type就是数据类型了,这个大家都很熟悉的,例如int,decimal
oracle存储过程编译错误问题
NULL 博文链接:https://forlab.iteye.com/blog/1821751


应用实例
