码迷,mamicode.com
首页 > 数据库 > 详细

sqlserver 存储过程 修改

时间:2017-08-31 18:02:54      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:and   creat   唯一性   sqlserver   date   赋值语句   base   字符   引号   

亲测可用

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

 

sqlserver 存储过程 修改

标签:and   creat   唯一性   sqlserver   date   赋值语句   base   字符   引号   

原文地址:http://www.cnblogs.com/zouke1220/p/7459294.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!