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 存储过程 修改的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver 如何修改储存过程的名字

sqlserver存储过程怎么调试

sqlserver2005 表A跟存储过程B存在依赖关系,我为表A添加了一列C,修改存储过程B时报错说列C不存在。

sqlserver 存储过程 修改

sqlserver过程中使用openquery 修改oracle数据时,存储过程中断,oracle的值被改为null

Sqlserver存储过程返回表,如何实现?