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 \'+@strTable+\' 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,@curr_Column-@prev)+\'=\'+substring(@strValue,@prev2,@curr_Value-@prev2)+\',\' +@tempString; else--最后一个 begin set @tempString =@tempString + substring(@strColumn,@prev,len(@strColumn)-@prev+1)+\'=\'+substring(@strValue,@prev2,len(@strValue)-@prev2+1); break; end set @num=@num-1; set @prev=@curr_Column+1; set @prev2=@curr_Value+1; end set @sqlString = @sqlString+@tempString+@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 \'+@strTable+\' 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 \' +@strTable+\' WHERE \' +@only_field+\'=\'+@only_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,@curr_Column-@prev)+\'=\'+substring(@strValue,@prev2,@curr_Value-@prev2)+\',\' +@tempString; else--最后一个 begin set @tempString =@tempString + substring(@strColumn,@prev,len(@strColumn)-@prev+1)+\'=\'+substring(@strValue,@prev2,len(@strValue)-@prev2+1); break; end set @num=@num-1; set @prev=@curr_Column+1; set @prev2=@curr_Value+1; end set @sqlString = @sqlString+@tempString+@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,@curr_Column-@prev)+\'=\'+substring(@strValue,@prev2,@curr_Value-@prev2)+\',\' +@tempString; else--最后一个 begin set @tempString =@tempString + substring(@strColumn,@prev,len(@strColumn)-@prev+1)+\'=\'+substring(@strValue,@prev2,len(@strValue)-@prev2+1); break; end set @num=@num-1; set @prev=@curr_Column+1; set @prev2=@curr_Value+1; end set @sqlString = @sqlString+@tempString+@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\'
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- 邹柯 ALTER PROCEDURE CollegeUpdate ( @ceid varchar(20)=null ,@username nvarchar(10)=null ,@cardid varchar(18)=null ,@age int=null ,@sex NChar(2) ,@image_path VarChar(50)=null ,@job_base_id int=null ,@level_base_id int=null ,@certificateid VarChar(15)=null ,@certificate_path VarChar(50)=null ,@BeginTime DateTime=null ,@EndTime DateTime=null ) WITH ENCRYPTION AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRY BEGIN TRAN; --先查询修改的用户id declare @userid int=null; select @userid=TutorId from Certificate where Id=@ceid; -- Update Certificate update Certificate set TutorId=@userid, JobId=@job_base_id, LevelId=@level_base_id, BeginTime=@BeginTime, EndTime=@EndTime, Id=@certificateid, ImageUrl=@certificate_path where Id=@ceid -- Update Tutor update Tutor set Name=@username, IdentityCard=@cardid, Age=@age, Gender=@sex, Photo=@image_path where Id=@userid COMMIT TRAN; END TRY BEGIN CATCH ROLLBACK TRAN; throw; END CATCH END /* USE [GmkCollege] GO DECLARE @return_value int EXEC @return_value = CollegeUpdate @ceid = 1, @username = \'测试123456\', @cardid = \'测试123456\', @age = 98, @sex = \'男\', @image_path = \'测试123456\', @job_base_id = 2, @level_base_id = 2, @certificateid = \'测试123456\', @certificate_path = \'测试123456\', @BeginTime=\'2016-06-06\', @EndTime=\'2017-01-01\', SELECT \'Return Value\' = @return_value GO */