如何判断存储过程变量的值是否为空?

xugang96 2018-03-11 07:43:25
如何判断存储过程变量的值是否为空?主要判断员工的字段输入值是否为空,我在另外一个表CMSFIE里定义了哪些字段可以为空哪些字段不能为空,然后在员工资料的保存中取这个字段的值来和CMSFIE中存储的是否为空标志进行比对;

模拟过程如下:
create proc myepatest
@EPA002 varchar(10), --员工信息字段
@EPA003 varchar(80), --员工信息字段
@EPA004 varchar(40) --员工信息字段
as
declare @R varchar(1000)
declare @fieldname varchar(10) --CMSFIE表中存储的字段名
declare @nsql nvarchar(1000)

declare mycursor cursor for
select (substring(FIE003,1,6)) Field from CMSFIE where FIE002='vCMSEPA' and FIE019='1' //从CMSFIE表中读出必填字段名

open mycursor

fetch next from mycursor into @fieldname

while (@@FETCH_STATUS=0)
begin
set @nsql='if (@'+@fieldname+'='''') or (@'+@fieldname+' is null) set @R=''x'' else set @R= ''y'' '
EXEC(@nSQL)
fetch next from mycursor into @fieldname
end
close mycursor
deallocate mycursor


---执行时报错 @EPA002,@EPA003 ,@R变量没有定义
该如何定义
...全文
1258 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-03-12
  • 打赏
  • 举报
回复
引用 2 楼 xugang96 的回复:
[quote=引用 1 楼 yenange 的回复:]
CREATE  PROC myepatest
@EPA002 VARCHAR(10), --员工信息字段
@EPA003 VARCHAR(80), --员工信息字段
@EPA004 VARCHAR(40) --员工信息字段
AS
BEGIN
	DECLARE @R VARCHAR(1000)
	DECLARE @fieldname VARCHAR(10) --CMSFIE表中存储的字段名
	DECLARE @nsql NVARCHAR(1000)
   
	DECLARE mycursor CURSOR  
	FOR
		SELECT (SUBSTRING(FIE003, 1, 6)) Field
		FROM   CMSFIE
		WHERE  FIE002         = 'vCMSEPA'
			   AND FIE019     = '1' --从CMSFIE表中读出必填字段名
  
  OPEN mycursor 
  
  FETCH NEXT FROM mycursor INTO @fieldname
  
	WHILE (@@FETCH_STATUS = 0)
	BEGIN
		SET @nsql = 'if (@' + @fieldname + '='''') or (@' + @fieldname + 
			' is null)  set  @R=''x'' else set @R= ''y'' '
	    
		--EXEC (@nSQL)
		---执行时报错 @EPA002,@EPA003 ,@R变量没有定义
		----------- 建议 ---------------------
		--不一定马上能用,但大致思路是这样,要根据你的需求和实际运行的效果来修改
		--先打印出SQL,便于核对
		PRINT @nsql
		--带参数的动态SQL, 必须用 sp_executesql ,并按规范给参数赋值
		EXEC sp_executesql 
			@nsql
			,'@EPA002 varchar(10)
			,@EPA003 VARCHAR(80)
			,@EPA004 VARCHAR(40)
			,@R varchar(1000)'
			,@EPA002
			,@EPA003
			,@EPA004
			,@R
	    
		FETCH NEXT FROM mycursor INTO @fieldname
	END
  CLOSE mycursor
  DEALLOCATE mycursor
谢谢解答,问题是我在游标循环里,一次只有一个字段带入进行判断啊,难道要把员工所有字段都带入SQL动态语句里? 我员工信息有90多个字段的了;这个正式的存储过程有90多个员工信息字段了;[/quote] 你每次都能弄清是哪个可以只带必须的。 如果搞不清, 就一次性带所有的。 只能多不能少。 多了不怕, 少了就出错了。
xugang96 2018-03-12
  • 打赏
  • 举报
回复
引用 4 楼 yenange 的回复:
[quote=引用 2 楼 xugang96 的回复:] [quote=引用 1 楼 yenange 的回复:]
CREATE  PROC myepatest
@EPA002 VARCHAR(10), --员工信息字段
@EPA003 VARCHAR(80), --员工信息字段
@EPA004 VARCHAR(40) --员工信息字段
AS
BEGIN
	DECLARE @R VARCHAR(1000)
	DECLARE @fieldname VARCHAR(10) --CMSFIE表中存储的字段名
	DECLARE @nsql NVARCHAR(1000)
   
	DECLARE mycursor CURSOR  
	FOR
		SELECT (SUBSTRING(FIE003, 1, 6)) Field
		FROM   CMSFIE
		WHERE  FIE002         = 'vCMSEPA'
			   AND FIE019     = '1' --从CMSFIE表中读出必填字段名
  
  OPEN mycursor 
  
  FETCH NEXT FROM mycursor INTO @fieldname
  
	WHILE (@@FETCH_STATUS = 0)
	BEGIN
		SET @nsql = 'if (@' + @fieldname + '='''') or (@' + @fieldname + 
			' is null)  set  @R=''x'' else set @R= ''y'' '
	    
		--EXEC (@nSQL)
		---执行时报错 @EPA002,@EPA003 ,@R变量没有定义
		----------- 建议 ---------------------
		--不一定马上能用,但大致思路是这样,要根据你的需求和实际运行的效果来修改
		--先打印出SQL,便于核对
		PRINT @nsql
		--带参数的动态SQL, 必须用 sp_executesql ,并按规范给参数赋值
		EXEC sp_executesql 
			@nsql
			,'@EPA002 varchar(10)
			,@EPA003 VARCHAR(80)
			,@EPA004 VARCHAR(40)
			,@R varchar(1000)'
			,@EPA002
			,@EPA003
			,@EPA004
			,@R
	    
		FETCH NEXT FROM mycursor INTO @fieldname
	END
  CLOSE mycursor
  DEALLOCATE mycursor
谢谢解答,问题是我在游标循环里,一次只有一个字段带入进行判断啊,难道要把员工所有字段都带入SQL动态语句里? 我员工信息有90多个字段的了;这个正式的存储过程有90多个员工信息字段了;[/quote] 你每次都能弄清是哪个可以只带必须的。 如果搞不清, 就一次性带所有的。 只能多不能少。 多了不怕, 少了就出错了。[/quote] 嗯,谢谢;我现在发现新问题是 变量@R在语句里的赋值没有作用
xugang96 2018-03-11
  • 打赏
  • 举报
回复
我的意思 就是比如我在设置界面设置了 EPA002字段为必填项,那么这里就只需要挑出EPA002 参数带入的值是否为空就可以了;就是 游标里最多出现EPA002字段。
xugang96 2018-03-11
  • 打赏
  • 举报
回复
引用 1 楼 yenange 的回复:
CREATE  PROC myepatest
@EPA002 VARCHAR(10), --员工信息字段
@EPA003 VARCHAR(80), --员工信息字段
@EPA004 VARCHAR(40) --员工信息字段
AS
BEGIN
	DECLARE @R VARCHAR(1000)
	DECLARE @fieldname VARCHAR(10) --CMSFIE表中存储的字段名
	DECLARE @nsql NVARCHAR(1000)
   
	DECLARE mycursor CURSOR  
	FOR
		SELECT (SUBSTRING(FIE003, 1, 6)) Field
		FROM   CMSFIE
		WHERE  FIE002         = 'vCMSEPA'
			   AND FIE019     = '1' --从CMSFIE表中读出必填字段名
  
  OPEN mycursor 
  
  FETCH NEXT FROM mycursor INTO @fieldname
  
	WHILE (@@FETCH_STATUS = 0)
	BEGIN
		SET @nsql = 'if (@' + @fieldname + '='''') or (@' + @fieldname + 
			' is null)  set  @R=''x'' else set @R= ''y'' '
	    
		--EXEC (@nSQL)
		---执行时报错 @EPA002,@EPA003 ,@R变量没有定义
		----------- 建议 ---------------------
		--不一定马上能用,但大致思路是这样,要根据你的需求和实际运行的效果来修改
		--先打印出SQL,便于核对
		PRINT @nsql
		--带参数的动态SQL, 必须用 sp_executesql ,并按规范给参数赋值
		EXEC sp_executesql 
			@nsql
			,'@EPA002 varchar(10)
			,@EPA003 VARCHAR(80)
			,@EPA004 VARCHAR(40)
			,@R varchar(1000)'
			,@EPA002
			,@EPA003
			,@EPA004
			,@R
	    
		FETCH NEXT FROM mycursor INTO @fieldname
	END
  CLOSE mycursor
  DEALLOCATE mycursor
谢谢解答,问题是我在游标循环里,一次只有一个字段带入进行判断啊,难道要把员工所有字段都带入SQL动态语句里? 我员工信息有90多个字段的了;这个正式的存储过程有90多个员工信息字段了;
吉普赛的歌 2018-03-11
  • 打赏
  • 举报
回复
CREATE  PROC myepatest
@EPA002 VARCHAR(10), --员工信息字段
@EPA003 VARCHAR(80), --员工信息字段
@EPA004 VARCHAR(40) --员工信息字段
AS
BEGIN
	DECLARE @R VARCHAR(1000)
	DECLARE @fieldname VARCHAR(10) --CMSFIE表中存储的字段名
	DECLARE @nsql NVARCHAR(1000)
   
	DECLARE mycursor CURSOR  
	FOR
		SELECT (SUBSTRING(FIE003, 1, 6)) Field
		FROM   CMSFIE
		WHERE  FIE002         = 'vCMSEPA'
			   AND FIE019     = '1' --从CMSFIE表中读出必填字段名
  
  OPEN mycursor 
  
  FETCH NEXT FROM mycursor INTO @fieldname
  
	WHILE (@@FETCH_STATUS = 0)
	BEGIN
		SET @nsql = 'if (@' + @fieldname + '='''') or (@' + @fieldname + 
			' is null)  set  @R=''x'' else set @R= ''y'' '
	    
		--EXEC (@nSQL)
		---执行时报错 @EPA002,@EPA003 ,@R变量没有定义
		----------- 建议 ---------------------
		--不一定马上能用,但大致思路是这样,要根据你的需求和实际运行的效果来修改
		--先打印出SQL,便于核对
		PRINT @nsql
		--带参数的动态SQL, 必须用 sp_executesql ,并按规范给参数赋值
		EXEC sp_executesql 
			@nsql
			,'@EPA002 varchar(10)
			,@EPA003 VARCHAR(80)
			,@EPA004 VARCHAR(40)
			,@R varchar(1000)'
			,@EPA002
			,@EPA003
			,@EPA004
			,@R
	    
		FETCH NEXT FROM mycursor INTO @fieldname
	END
  CLOSE mycursor
  DEALLOCATE mycursor

22,210

社区成员

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

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