动态生产的SQL语句,varchar(8000)长度不够

weisai 2010-02-23 03:40:13

我取我发的一个贴的答案(如下)来做,发现@SQL 长度不够,出现截断,当然执行就报错了,怎么处理?
我试过分拆两个varchar,但是不好做。

http://topic.csdn.net/u/20100208/21/e4a44971-177e-45b0-a3b0-b49eff2fad28.html


DECLARE @SQL VARCHAR(8000),@table_name varchar(20)
set @table_name='tt1'


select
@sql=isnull(@sql+',','')+'(select 值 from 基础表 where FID=a.['+name+']) as ['+name+']'
from sys.syscolumns WHERE id=OBJECT_ID(@table_name)
and name !='fnum'

select @sql='select fnum,'+@sql+ 'from '+@table_name+' a'

exec(@sql)
...全文
550 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
dong3431 2010-02-26
  • 打赏
  • 举报
回复
用varchar(max)
  • 打赏
  • 举报
回复
EXEC(@SQL+@SQL1..)这招实在太牛B了
sannychan 2010-02-25
  • 打赏
  • 举报
回复
第一次碰到这么长的。。。。学习
流氓兔 2010-02-24
  • 打赏
  • 举报
回复
待高人啦!
回复太短!
永生天地 2010-02-24
  • 打赏
  • 举报
回复
8000都不够,难道你一条语句能写那么多,如果不是一条语句,那就可以拆开执行,拆开了需要加上事务
ChinaITOldMan 2010-02-24
  • 打赏
  • 举报
回复
EXEC(@SQL+@SQL1..)
duanxugang 2010-02-23
  • 打赏
  • 举报
回复
学习。。。。。。。学习
nalnait 2010-02-23
  • 打赏
  • 举报
回复
text字段处理的仅有:   
下面的函数和语句可以与 ntext、text 或 image 数据一起使用。
函数 语句
DATALENGTH READTEXT
PATINDEX SET TEXTSIZE
SUBSTRING UPDATETEXT
TEXTPTR WRITETEXT
TEXTVALID

主题: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值为空会出错,需注意。



----------------------------------------------------------------------
--更新text字段的值
create table PE_Soft(SoftIntro text,ChannelID integer)
insert into PE_Soft
select 'aaa ',1004
union all
select 'bbb ',1003
union all
select 'ccc ',1002

declare @ptr binary(16)
select @ptr=textptr(SoftIntro) from PE_Soft where ChannelID=1002
updatetext PE_Soft.SoftIntro @ptr null 0 'testing '
select * from PE_Soft

drop table PE_Soft


--text字段增加处理

--创建测试表
create table test(id varchar(3),detail text)
insert into test
select '001','A*B'

--定义添加的的字符串
declare @s_str varchar(8000),@postion int
select @s_str='*C' --要添加的字符串
,@postion=null --追加的位置,null 加在尾部,0 加在首部,其他值则加在指定位置

--字符串添加处理
declare @p varbinary(16)
select @p=textptr(detail) from test where id='001'
updatetext test.detail @p @postion 0 @s_str

--显示处理结果
select * from test
go

--删除测试表
drop table test


--text字段的替换处理

--创建数据测试环境
create table test(id varchar(3),txt text)
insert into test
select '001','A*B'
go

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

--字符串替换处理
declare @p varbinary(16),@postion int,@rplen int
select @p=textptr(txt)
,@rplen=len(@s_str)
,@postion=charindex(@s_str,txt)-1
from test where id='001'

while @postion>0
begin
updatetext test.txt @p @postion @rplen @d_str
select @postion=charindex(@s_str,txt)-1 from test
end

--显示结果
select * from test

go
--删除数据测试环境
drop table test

--text字段的添加处理存储过程--全表

--创建测试表
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 行)
--*/
--text字段的替换处理--全表替换

--创建数据测试环境
create table test(id varchar(3),txt text)
insert into test
select '001','A*B'
union all select '002','A*B-AA*BB'
go

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


--定义游标,循环处理数据
declare @id varchar(3)
declare #tb cursor for select id from test
open #tb
fetch next from #tb into @id
while @@fetch_status=0
begin
--字符串替换处理
declare @p varbinary(16),@postion int,@rplen int
select @p=textptr(txt)
,@rplen=len(@s_str)
,@postion=charindex(@s_str,txt)-1
from test where id=@id

while @postion>0
begin
updatetext test.txt @p @postion @rplen @d_str
select @postion=charindex(@s_str,txt)-1 from test where id=@id
end

fetch next from #tb into @id
end
close #tb
deallocate #tb

--显示结果
select * from test

go
--删除数据测试环境
drop table test

************************
支持text字段处理的仅有:
下面的函数和语句可以与 ntext、text 或 image 数据一起使用。
函数 语句
DATALENGTH READTEXT
PATINDEX SET TEXTSIZE
SUBSTRING UPDATETEXT
TEXTPTR WRITETEXT
TEXTVALID


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值为空会出错,需注意
老黎 2010-02-23
  • 打赏
  • 举报
回复
老用户
引用 10 楼 yang_ 的回复:
拆分是可以的,不过要定义多个变量
记得6.5varchar最多255,那时经常需要多个变量拆分,现在懒得写了
Yang_ 2010-02-23
  • 打赏
  • 举报
回复
拆分是可以的,不过要定义多个变量
记得6.5varchar最多255,那时经常需要多个变量拆分,现在懒得写了
老黎 2010-02-23
  • 打赏
  • 举报
回复
mark,原来还可以这样
weisai 2010-02-23
  • 打赏
  • 举报
回复

http://topic.csdn.net/u/20100208/21/e4a44971-177e-45b0-a3b0-b49eff2fad28.html
中ldslove 的答案

然后把8000改成50,
DECLARE @SQL VARCHAR(50),@SQL1 VARCHAR(50)
大家怎么拆分
Mr_Nice 2010-02-23
  • 打赏
  • 举报
回复
@sql+@sql2

这样试试?
feixianxxx 2010-02-23
  • 打赏
  • 举报
回复
引用 4 楼 weisai 的回复:
版本SQL 2000
@SQL+@SQL1对这种情况不好处理,怎么拆分?

2000太长 就分成几个变量
weisai 2010-02-23
  • 打赏
  • 举报
回复
对局部变量,ntext无效
weisai 2010-02-23
  • 打赏
  • 举报
回复
版本SQL 2000
@SQL+@SQL1对这种情况不好处理,怎么拆分?

ws_hgo 2010-02-23
  • 打赏
  • 举报
回复
DECLARE @SQL ntext
百年树人 2010-02-23
  • 打赏
  • 举报
回复
SQL2005及以上的版本,可以用varchar(max)
SQL77 2010-02-23
  • 打赏
  • 举报
回复
EXEC(@SQL+@SQL1..)

34,594

社区成员

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

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