CREATE PROCEDURE [dbo].[UpdateMessage]
@strTable varchar(), --要修改的表
@strColumn varchar(),--要修改的列名(如果有多个,用英文逗号分隔)
@strValue varchar(), --新的值(用英文逗号分隔,如果是字符串,需加单引号)
@strWhere varchar() --where条件,不加wehere,直接 列名=值,如果值是字符串,需加单引号
as
--变量
declare @sqlString nvarchar(); --完整的update语句
declare @whereString varchar(); --where条件
declare @tempString varchar(); --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=;
set @prev=;
set @prev2=;
set @num=(len(@strValue)-len(replace(@strValue,',','')))+;
--开始循环处理
while ( @num > )
begin
--print @prev2 --
--print @prev --
set @curr_Column=charindex(',',@strColumn,@prev);--print @curr_Column --
set @curr_Value= charindex(',',@strValue,@prev2);--print @curr_Value --
if @num>
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+)+'='+substring(@strValue,@prev2,len(@strValue)-@prev2+);
break;
end
set @num=@num-;
set @prev=@curr_Column+;
set @prev2=@curr_Value+;
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(), --要修改的表
@strColumn varchar(),--要修改的列名(如果有多个,用英文逗号分隔)
@strValue varchar(), --新的值(用英文逗号分隔,如果是字符串,需加单引号)
@strWhere varchar(), --where条件,不加wehere,直接 列名=值,如果值是字符串,需加单引号
@only_field varchar()=null, --唯一性字段(列名)
@only_value varchar()=null, --唯一性字段值
@msg nvarchar()=null, --错误消息
@not_self varchar()=null --排除自己这行
as
BEGIN
--变量
declare @sqlString nvarchar(); --完整的update语句
declare @whereString varchar(); --where条件
declare @tempString varchar(); --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=;
set @prev=;
set @prev2=;
set @num=(len(@strValue)-len(replace(@strValue,',','')))+;
IF @only_field is not null
BEGIN
declare @p int; --查询唯一性结果
declare @sql nvarchar(); --拼接查询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 >
begin
raiserror(@msg ,,)
return
end
else
begin
--开始循环处理
while ( @num > )
begin
--print @prev2 --
--print @prev --
set @curr_Column=charindex(',',@strColumn,@prev);--print @curr_Column --
set @curr_Value= charindex(',',@strValue,@prev2);--print @curr_Value --
if @num>
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+)+'='+substring(@strValue,@prev2,len(@strValue)-@prev2+);
break;
end
set @num=@num-;
set @prev=@curr_Column+;
set @prev2=@curr_Value+;
end
set @sqlString = @sqlString+@tempString+@whereString;
exec(@sqlString);
end
END
ELSE
BEGIN
--开始循环处理
while ( @num > )
begin
--print @prev2 --
--print @prev --
set @curr_Column=charindex(',',@strColumn,@prev);--print @curr_Column --
set @curr_Value= charindex(',',@strValue,@prev2);--print @curr_Value --
if @num>
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+)+'='+substring(@strValue,@prev2,len(@strValue)-@prev2+);
break;
end
set @num=@num-;
set @prev=@curr_Column+;
set @prev2=@curr_Value+;
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','',N'会员卡号已存在,不能重复添加!','ID !=554711'
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- 邹柯
ALTER PROCEDURE CollegeUpdate
(
@ceid varchar()=null
,@username nvarchar()=null
,@cardid varchar()=null
,@age int=null
,@sex NChar()
,@image_path VarChar()=null
,@job_base_id int=null
,@level_base_id int=null
,@certificateid VarChar()=null
,@certificate_path VarChar()=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
*/

sqlserver 存储过程 修改的更多相关文章

  1. SQLServer之修改存储过程

    修改存储过程注意事项 只能修改先前在 SQL Server 中通过执行 CREATE PROCEDURE 语句创建的过程. Transact-SQL 存储过程修改为 CLR 存储过程,反之亦然. AL ...

  2. SqlServer存储过程学习笔记(增删改查)

    * IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...

  3. SQLServer Alter 修改表的列名的解决

    解决:在SQLServer中修改表的列名,可以调用存储过程sp_rename. [sql]use Test;--使用数据库  sp_rename 'd_s_t.avg_grade','avg_g',' ...

  4. SQLSERVER存储过程语法详解

    CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ...

  5. SqlServer存储过程详解

    SqlServer存储过程详解 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) dro ...

  6. SqlServer存储过程(增删改查)

    * IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...

  7. SQLSERVER存储过程的基本语法实例

    SQLSERVER存储过程的基本语法实例 SQLSERVER存储过程的基本语法实例 一.定义变量--简单赋值 declare @a intset @a=5 print @a --使用select语句赋 ...

  8. SqlServer存储过程的创建与使用

    什么是存储过程? T-SQL中的存储过程,非常类似于net语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句. 这样就可以提高存储过程的性能. ...

  9. Sqlserver 存储过程

    转载自:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html Transact-SQL中的存储过程,非常类似于Java语言中的方法, ...

随机推荐

  1. ASP.NET Core教程【一】关于Razor Page的知识

    关键文件和目录结构 按照asp.net core WEB应用程序向导,创建一个工程之后 你会发现如下几个目录和文件 wwwroot:放置网站的静态文件的目录 Pages:放置razor页面的目录 ap ...

  2. Python 日志处理(一) 按Nginx log_format 分割日志记录

    要求:不使用正则 根据nginx 默认的日志记录格式,分割日志记录. log_format main '$remote_addr - $remote_user [$time_local] " ...

  3. Python爬虫知识点四--scrapy框架

    一.scrapy结构数据 解释: 1.名词解析: o 引擎(Scrapy Engine)o 调度器(Scheduler)o 下载器(Downloader)o 蜘蛛(Spiders)o 项目管 ...

  4. LINQ学习系列-----1.3 扩展方法

    这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性.    一.扩展方法介绍   废话不多说,先上源码截图: 上图中Ge ...

  5. selenium 定位input输入框下的选择项

    今天的问题与下图中的类似 这是一个input型输入框,当我点击或输入值时,输入框下方会显示选择项帮助快速输入,代码如下: <input class="v-input some" ...

  6. RPC是什么

    RPC是什么? 通俗的讲就是,调用远程计算机上的服务,就像调用本地服务一样.通常包含传输协议和编码协议. RPC可以基于HTTP或TCP协议,但基于HTTP协议的RPC性能却不如基于TCP协议的RPC ...

  7. 如何清除PHP中不需要的Layout模板

    最简单的办法就是在需要清除的静态页的最前端加上   {__NOLAYOUT__}  就可以清除所有的layout效果, 继而设置自己的css.js效果.

  8. Wannafly挑战赛5 补题

    A 珂朵莉与宇宙 题目链接: https://www.nowcoder.com/acm/contest/36/A 思路: 科学暴力:枚举前缀和,同时计算前缀和里面可能出现的完全平方数,匹配前缀和 与完 ...

  9. poj 2769 Reduced ID Numbers 同余定理

    链接:http://poj.org/problem?id=2769 题意:寻找数m,是的对于n个数的余数不同 思路:暴力,优化:同余部分不用测试 代码: #include <iostream&g ...

  10. 51Nod 1267 4个数和为0 二分

    给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No".Input第1行,1个数N,N为数组的长度(4 <= ...