sqlserver 存储过程 修改
Posted 邹柯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver 存储过程 修改相关的知识,希望对你有一定的参考价值。
亲测可用
CREATE PROCEDURE [dbo].[UpdateMessage] @strTable varchar(50), --要修改的表 @strColumn varchar(500),--要修改的列名(如果有多个,用英文逗号分隔) @strValue varchar(500), --新的值(用英文逗号分隔,如果是字符串,需加单引号) @strWhere varchar(500) --where条件,不加wehere,直接 列名=值,如果值是字符串,需加单引号 as --变量 declare @sqlString nvarchar(4000); --完整的update语句 declare @whereString varchar(500); --where条件 declare @tempString varchar(5000); --update语句中间的赋值语句 declare @curr_Column int; --列名字符串的当前位置 declare @curr_Value int; --值字符串的当前位置 declare @prev int; --光标位置 declare @prev2 int; --光标位置 declare @num int; --字段个数 --变量赋初值 set @sqlString = ‘update ‘[email protected]+‘ set ‘; set @whereString = ‘ where ‘+@strWhere; set @tempString=‘‘; set @curr_Column=1; set @prev=1; set @prev2=1; set @num=(len(@strValue)-len(replace(@strValue,‘,‘,‘‘)))+1; --开始循环处理 while ( @num > 0) begin --print @prev2 -- 1 10 15 --print @prev -- 1 9 18 set @curr_Column=charindex(‘,‘,@strColumn,@prev);--print @curr_Column -- 8 17 0 set @curr_Value= charindex(‘,‘,@strValue,@prev2);--print @curr_Value -- 9 14 0 if @num>1 set @tempString = substring(@strColumn,@prev,@[email protected])+‘=‘+substring(@strValue,@prev2,@[email protected])+‘,‘ +@tempString; else--最后一个 begin set @tempString [email protected] + substring(@strColumn,@prev,len(@strColumn)[email protected]+1)+‘=‘+substring(@strValue,@prev2,len(@strValue)[email protected]+1); break; end set @[email protected]1; set @[email protected]_Column+1; set @[email protected]_Value+1; end set @sqlString = @[email protected]+@whereString; exec(@sqlString); --execute [dbo].[UpdateMessage] ‘base._Member‘,"AcctNbr","‘999999‘",‘ID=554585‘ --execute [dbo].[UpdateMessage] ‘base._Member‘,‘AcctNbr,AcctName,AcctPswd1‘,"‘999999‘,‘zz‘,‘852852‘",‘ID=554585‘
CREATE PROCEDURE [dbo].[UpdateMessage] @strTable varchar(50), --要修改的表 @strColumn varchar(500),--要修改的列名(如果有多个,用英文逗号分隔) @strValue varchar(500), --新的值(用英文逗号分隔,如果是字符串,需加单引号) @strWhere varchar(500), --where条件,不加wehere,直接 列名=值,如果值是字符串,需加单引号 @only_field varchar(20)=null, --唯一性字段(列名) @only_value varchar(20)=null, --唯一性字段值 @msg nvarchar(50)=null, --错误消息 @not_self varchar(50)=null --排除自己这行 as BEGIN --变量 declare @sqlString nvarchar(4000); --完整的update语句 declare @whereString varchar(500); --where条件 declare @tempString varchar(5000); --update语句中间的赋值语句 declare @curr_Column int; --列名字符串的当前位置 declare @curr_Value int; --值字符串的当前位置 declare @prev int; --光标位置 declare @prev2 int; --光标位置 declare @num int; --字段个数 --变量赋初值 set @sqlString = ‘update ‘[email protected]+‘ set ‘; set @whereString = ‘ where ‘+@strWhere; set @tempString=‘‘; set @curr_Column=1; set @prev=1; set @prev2=1; set @num=(len(@strValue)-len(replace(@strValue,‘,‘,‘‘)))+1; IF @only_field is not null BEGIN declare @p int; --查询唯一性结果 declare @sql nvarchar(1000); --拼接查询sql字串 set @sql=‘SELECT @p=count(1) FROM ‘ [email protected]+‘ WHERE ‘ [email protected]_field+‘=‘[email protected]_value+‘ AND ‘+@not_self; exec sp_executesql @sql,N‘@p AS int OUTPUT‘,@p OUTPUT if @p > 0 begin raiserror(@msg ,16,1) return end else begin --开始循环处理 while ( @num > 0) begin --print @prev2 -- 1 10 15 --print @prev -- 1 9 18 set @curr_Column=charindex(‘,‘,@strColumn,@prev);--print @curr_Column -- 8 17 0 set @curr_Value= charindex(‘,‘,@strValue,@prev2);--print @curr_Value -- 9 14 0 if @num>1 set @tempString = substring(@strColumn,@prev,@[email protected])+‘=‘+substring(@strValue,@prev2,@[email protected])+‘,‘ +@tempString; else--最后一个 begin set @tempString [email protected] + substring(@strColumn,@prev,len(@strColumn)[email protected]+1)+‘=‘+substring(@strValue,@prev2,len(@strValue)[email protected]+1); break; end set @[email protected]1; set @[email protected]_Column+1; set @[email protected]_Value+1; end set @sqlString = @[email protected]+@whereString; exec(@sqlString); end END ELSE BEGIN --开始循环处理 while ( @num > 0) begin --print @prev2 -- 1 10 15 --print @prev -- 1 9 18 set @curr_Column=charindex(‘,‘,@strColumn,@prev);--print @curr_Column -- 8 17 0 set @curr_Value= charindex(‘,‘,@strValue,@prev2);--print @curr_Value -- 9 14 0 if @num>1 set @tempString = substring(@strColumn,@prev,@[email protected])+‘=‘+substring(@strValue,@prev2,@[email protected])+‘,‘ +@tempString; else--最后一个 begin set @tempString [email protected] + substring(@strColumn,@prev,len(@strColumn)[email protected]+1)+‘=‘+substring(@strValue,@prev2,len(@strValue)[email protected]+1); break; end set @[email protected]1; set @[email protected]_Column+1; set @[email protected]_Value+1; end set @sqlString = @[email protected]+@whereString; exec(@sqlString); END END --execute [dbo].[UpdateMessage] ‘base._Member‘,‘AcctNbr,AcctName,AcctPswd1‘,"‘2999999‘,‘zz‘,‘852852‘",‘ID=554710‘,NULL,NULL,NULL,NULL --execute [dbo].[UpdateMessage] ‘base._Member‘,‘AcctNbr,AcctName,AcctPswd1‘,"‘12999999‘,‘zz‘,‘852852‘",‘ID=554711‘,‘AcctNbr‘,‘12999999‘,N‘会员卡号已存在,不能重复添加!‘,‘ID !=554711‘
以上是关于sqlserver 存储过程 修改的主要内容,如果未能解决你的问题,请参考以下文章
sqlserver2005 表A跟存储过程B存在依赖关系,我为表A添加了一列C,修改存储过程B时报错说列C不存在。