标题:SQL2000存储过程UPDATE实现参数随意个数?
只看楼主
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
结帖率:98.96%
已结贴  问题点数:5 回复次数:4 
SQL2000存储过程UPDATE实现参数随意个数?
你们有没这样的存储过程,正常情况下,1个表很多字段,比如20个字段,但有时候,只更新其中的15个,有时候,只更新其中的17个?如果次次都按参数的个数来写1个过程,那就很多个了。于是,我就想,有没有存储过程,可以实现,随便个数的参数的,就出现以下的了。。
ALTER PROCEDURE [dbo].[update_stuMarks]
@stu_name char(10)=null,
@stu_age int=null,
@stu_sex char(10)=null,
@res int output
AS
declare @set_str char(250)
declare @where_str char(250)
declare @sql_str char(500)
set @set_str=null
if @stu_name is not null
begin
   if @set_str is null
      set @set_str='stu_name='+ltrim(rtrim(@stu_name))
   else
      set @set_str='stu_name='+ltrim(rtrim(@stu_name))+','+ltrim(rtrim(@set_str))
end
if @stu_sex is not null
begin
   if @set_str is null
      set @set_str='stu_sex='+ltrim(rtrim(@stu_sex))
   else
      set @set_str='stu_sex='+ltrim(rtrim(@stu_sex))+','+ltrim(rtrim(@set_str))
end
if @stu_age is not null
begin
   if @set_str is null
      set @set_str='stu_age='+ltrim(rtrim(@stu_age))
   else
      set @set_str='stu_age='+ltrim(rtrim(@stu_age))+','+ltrim(rtrim(@set_str))
end
if @set_str is null
   set @res=-1
else
begin
   set @sql_str='update stuMarks set '+ @set_str
   exec(@sql_str)
   set @res=1
end
--select @res,@set_str
GO

declare @res1 int
declare @stu_name char(10)
declare @stu_sex char(10)
declare @stu_age int

set @stu_name=30
set @stu_sex=20
set @stu_age=10
exec update_stuMarks @stu_name=@stu_name,@res=@res1 output
--exec update_stuMarks @stu_name=@stu_name,@stu_sex=@stu_sex,@res=@res1 output
--exec update_stuMarks @stu_name=@stu_name,@stu_sex=@stu_sex,@stu_age=@stu_age,@res=@res1 output

select * from stuMarks

这样的方法可以吗?实用不?


[ 本帖最后由 mywisdom88 于 2015-7-7 17:39 编辑 ]
搜索更多相关主题的帖子: null 
2015-07-07 17:29
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
另外,能不能把运行,红字的,是否正取运行返回给@res,我用 set @res= exec(@sql_str)出错,不知道怎么用。。
if @set_str is null
    set @res=-1
else
 begin
    set @sql_str='update stuMarks set '+ @set_str
    exec(@sql_str)
    set @res=1
 end


[ 本帖最后由 mywisdom88 于 2015-7-7 17:38 编辑 ]
2015-07-07 17:37
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
多了个WHERE,,,,,
ALTER PROCEDURE [dbo].[update_stuMarks]
@stu_name char(10)=null,
@stu_age int=null,
@stu_sex char(10)=null,
@stu_where char(250)=null,
@res int output
AS

declare @set_str char(250)
declare @where_str char(250)
declare @sql_str char(500)
set @set_str=null
set @where_str=null

if @stu_name is not null
begin
   if @set_str is null
      set @set_str='stu_name='+ltrim(rtrim(@stu_name))
   else
      set @set_str='stu_name='+ltrim(rtrim(@stu_name))+','+ltrim(rtrim(@set_str))
end

if @stu_sex is not null
begin
   if @set_str is null
      set @set_str='stu_sex='+ltrim(rtrim(@stu_sex))
   else
      set @set_str='stu_sex='+ltrim(rtrim(@stu_sex))+','+ltrim(rtrim(@set_str))
end

if @stu_age is not null
begin
   if @set_str is null
      set @set_str='stu_age='+ltrim(rtrim(@stu_age))
   else
      set @set_str='stu_age='+ltrim(rtrim(@stu_age))+','+ltrim(rtrim(@set_str))
end

 
if @set_str is null
   set @res=-1
else
begin
   if @stu_where is null
      set @sql_str='update stuMarks set '+ @set_str
   else
      set @sql_str='update stuMarks set '+ @set_str  +' where '+@stu_where
   exec(@sql_str)
   set @res=1
end
--select @res,@set_str

GO

declare @res1 int
declare @stu_name char(10)
declare @stu_sex char(10)
declare @stu_age int
declare @sql_where char(250)

set @stu_name=20
set @stu_sex=20
set @stu_age=20
set @sql_where=' stu_no=2'
exec update_stuMarks @stu_name=@stu_name,@stu_sex=@stu_sex,@stu_age=@stu_age,@stu_where=@sql_where,@res=@res1 output

select * from stuMarks

select @res1
2015-07-07 18:04
hepingfly
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:15
帖 子:195
专家分:657
注 册:2015-5-21
得分:5 
办法本身应该可行。(没表没测试楼主代码)。exec(@sql_str) 通不过,试试 sp_executesql 方式。
“你们有没这样的存储过程,正常情况下,1个表很多字段,比如20个字段,但有时候,只更新其中的15个,有时候,只更新其中的17个?如果次次都按参数的个数来写1个过程,那就很多个了”
 
楼主如果非要用‘存储过程’实现,肯定会出现上面的代码形式。但是实现楼主这种要求,vfp 是用不着这么麻烦
的。vfp 使用 server 很灵活,除了调用固定的‘存储过程’,他可以用参数形成语句代替‘存储过程’,直接执行就是了。也不会存在那个 exec(@sql_str) 通不过的问题 (server 2000 这个现象会发生的)。 时间紧暂不举例了.....






星际花草
2015-07-08 00:42
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
知道了,我用存储过程,主要是想在插入数据的时候,先检查,要是没这个记录,才插入。
我在存储过程那里,有检查语句,有返回值,
要是VFP直接写语句,那就要写查询语句,和插入语句,要执行2次,要是用SCAN ..ENDSACN来插入多条数据,不知道是用存储过程快还是VFP直接语句快。
我晚上测试看看。
我上面的语句,是可以执行的,我只是在问,这方法的可行性。。上面是UPDATE,其实,我们目的是INSERT的,只是UPDATE比较容易测试
2015-07-08 15:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-455166-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.631812 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved