白分求一存储过程正确写法

zcwok 2003-11-25 03:03:01
现有user(用户表)以及order(订单表),两个表通过UID字段关联,要求批量更新order表符合特定条件的用户的日志字段。就是在原有日志后边加上新内容,其中@Strlog为日志增量。我写的存储过程如下,总是抱错,说是加法运算符无效。求高人指点。

CREATE PROCEDURE spUpdateUserLog
@StrLog text,
@State int
AS
UPDATE user SET UserLog = UserLog + @StrLog
select UserLog from user,order where
user.UID=order.UID and State=@State
...全文
38 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengdali 2003-11-25
  • 打赏
  • 举报
回复
text字段的替换处理
http://expert.csdn.net/Expert/topic/2236/2236811.xml?temp=2.662295E-
pengdali 2003-11-25
  • 打赏
  • 举报
回复
CREATE PROCEDURE spUpdateUserLog
@StrLog text,
@State int
AS

declare @p varbinary(16),@rplen int

select @p=textptr(UserLog),@rplen=datalength(UserLog)/2 from [user] where id=@State
updatetext [user].UserLog @p @rplen 0 @a



select UserLog from [user],order where [user].UID=order.UID and State=@State

不是吗?
zjcxc 元老 2003-11-25
  • 打赏
  • 举报
回复
我不是说得很清楚了吗?

text字段不支持你的那种更新方式.


得用updetext+游标逐个修改.
存储过程不是也帮你改了吗?

zcwok 2003-11-25
  • 打赏
  • 举报
回复
现在关键是文本字段在原有内容上追加内容的问题,因为就算把Log字段放在order表
CREATE PROCEDURE spUpdateOrderLog
@strLog text,
@State int
AS
UPDATE order SET OrderLog = OrderLog+@strLog
where State=@State
也不行
zjcxc 元老 2003-11-25
  • 打赏
  • 举报
回复
--下面是数据测试

--创建测试表
create table [user](uid int,UserLog text)
create table [order](uid int,state bit)

insert into [user]
select 1,'a'
union all select 2,'b'
union all select 3,'c'

insert into [order]
select 1,1
union all select 2,0
union all select 3,1
go

--处理的存储过程
CREATE PROCEDURE spUpdateUserLog
@StrLog text,
@State int
AS
--定义游标,循环处理数据
declare @uid int
declare #tb cursor for select a.uid from [user] a join [order] b on a.uid=b.uid
where state=@state

open #tb
fetch next from #tb into @uid
while @@fetch_status=0
begin
--字符串添加处理
declare @p varbinary(16)
select @p=textptr(UserLog) from [user] where uid=@uid
updatetext [user].UserLog @p null 0 @StrLog
fetch next from #tb into @uid
end
close #tb
deallocate #tb
go

--调用示例:
exec spUpdateUserLog '123',1

--显示处理结果
select * from [user]

go

--删除测试环境
drop table [user],[order]
drop proc spUpdateUserLog

/*--测试结果

uid UserLog
----------- ----------
1 a123
2 b
3 c123

(所影响的行数为 3 行)
--*/
txlicenhe 2003-11-25
  • 打赏
  • 举报
回复
主题:text字段
1:替换

--创建数据测试环境
create table #tb(aa text)
insert into #tb select 'abc123abc123,asd'

--定义替换的字符串
declare @s_str varchar(8000),@d_str varchar(8000)
select @s_str='123' --要替换的字符串
,@d_str='000' --替换成的字符串

--字符串替换处理
declare @p varbinary(16),@postion int,@rplen int
select @p=textptr(aa),@rplen=len(@s_str),@postion=charindex(@s_str,aa)-1 from #tb
while @postion>0
begin
updatetext #tb.aa @p @postion @rplen @d_str
select @postion=charindex(@s_str,aa)-1 from #tb
end

--显示结果
select * from #tb

--删除数据测试环境
drop table #tb

/****************全部替换************************/
DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(aa) FROM #tb WHERE aa like '%数据2%'
if @ptrval is not null -- 一定要加上此句,否则若找不到数据下一句就会报错
UPDATETEXT #tb.aa @ptrval 0 null '数据3'
/****************在字段尾添加**********************************/
--定义添加的的字符串
declare @s_str varchar(8000)
select @s_str='*C' --要添加的字符串
--字符串添加处理
declare @p varbinary(16),@postion int,@rplen int
select @p=textptr(detail) from test where id='001'
updatetext test.detail @p null null @s_str

总结:
1:Text字段类型不能直接用replace函数来替换,必须用updatetext
2:字段比较不能用 where 字段 = ‘某数据’,可以用like来代替
3:updatetext时,若@ptrval值为空会出错,需注意。
pengdali 2003-11-25
  • 打赏
  • 举报
回复
CREATE PROCEDURE spUpdateUserLog
@StrLog text,
@State int
AS

declare @p varbinary(16),@rplen int

select @p=textptr(UserLog),@rplen=datalength(UserLog)/2 from [user] where id=@State
updatetext [user].UserLog @p @rplen 0 @a



select UserLog from [user],order where [user].UID=order.UID and State=@State
txlicenhe 2003-11-25
  • 打赏
  • 举报
回复
/****************在字段尾添加**********************************/
--定义添加的的字符串
declare @s_str varchar(8000)
select @s_str='*C' --要添加的字符串
--字符串添加处理
declare @p varbinary(16),@postion int,@rplen int
select @p=textptr(detail) from test where id='001'
updatetext test.detail @p null null @s_str
zjcxc 元老 2003-11-25
  • 打赏
  • 举报
回复
text字段不支持你的那种更新方式.

所以要用上面的方法,用游标逐个修改.
pengdali 2003-11-25
  • 打赏
  • 举报
回复
CREATE PROCEDURE spUpdateUserLog
@StrLog text,
@State int
AS
UPDATE [user] SET UserLog=UserLog+@StrLog where State=@State

select UserLog from [user],[order] where [user].UID=[order].UID and State=@State
zjcxc 元老 2003-11-25
  • 打赏
  • 举报
回复
CREATE PROCEDURE spUpdateUserLog
@StrLog text,
@State int
AS
--定义游标,循环处理数据
declare @uid int
declare #tb cursor for select a.uid from [user] a join [order] b on a.uid=b.uid
where state=@state

open #tb
fetch next from #tb into @uid
while @@fetch_status=0
begin
--字符串添加处理
declare @p varbinary(16)
select @p=textptr(UserLog) from [user] where uid=@uid
updatetext [user].UserLog @p null 0 @StrLog
fetch next from #tb into @uid
end
close #tb
deallocate #tb
go
pengdali 2003-11-25
  • 打赏
  • 举报
回复

CREATE PROCEDURE spUpdateUserLog
@StrLog text,
@State int
AS
UPDATE [user] SET UserLog=UserLog+@StrLog

select UserLog from [user],[order] where [user].UID=[order].UID and State=@State

34,872

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧