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
*/