SQL查询结果,如何不用循环movenext方法获得全部值

AMinfo 2013-12-30 10:35:35
有一条sql查询语句,通过外部调用
select id from tablename

目前是通过循环的方式获得字段id的值有值
表结果如下:
id bigint 自动编号
Title nvarchar(30)
----------------------------
id Title
1 A
2 B
3 C
4 D
5 E
6 F
-----------------------------

目前是通过
select id from tablename
然后用
do while not rs.movenext
idList = idList & "," & rs("id")
rs.movenext
loop
获得所有的id

有没有更简单的方法,不需要通过循环,不需要通过rs.movenext,直接sql查询完后获得所有的id?
...全文
577 79 打赏 收藏 转发到动态 举报
写回复
用AI写文章
79 条回复
切换为时间正序
请发表友善的回复…
发表回复
orochiheart 2013-12-31
  • 打赏
  • 举报
回复
不懂
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
同样,把预先结果先存入临时表再update,如果在UPDATE的过程中这样做,锁问题比较严重。对于like ,目前的确没有非常优秀的解决办法,如果频繁需要这样做,你首要的任务是检讨设计,CPU、内存、IO这些,如果你的机器本身性能还可以,那就要考虑语句的优化,因为还没达到最大吞吐量之前不能说资源有问题。外部处理,特别是循环,如果不能进行集合操作,同样速度不会有很大提升,并且前面说过,sqlserver对这部分的外部查询没有什么优化可言。
AMinfo 2013-12-31
  • 打赏
  • 举报
回复
引用 61 楼 DBA_Huangzj 的回复:
他们使用XML转换,速度不如我那个。like 如果无法避免,就考虑用全文,不过全文低版本中准确性有点不靠谱,高版本没测过。另外对description这些字段,可以考虑把核心词提取出来放到一个列中做搜索键,加上索引,这样速度就快很多,
description这个字段的内容无规则,几乎不会重复,长短不一,有字母、数字或者汉字,以及其他unicode字符,刚才试着对这个字段做了全文索引后,对速度没有任何改观。
AMinfo 2013-12-31
  • 打赏
  • 举报
回复
可能我没有说明白问题 1、只是无条件查询id,速度不受影响; 2、受影响的是用了like %%模糊匹配关键词并update,用了这个模糊匹配后,通过内部存储查询速度极慢,5个/分钟;而用外部查询语句循环的话,60个/分钟,速度更快一些,但非常占CPU,虽然如此,还是希望能将速度再提升一下。
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
他们使用XML转换,速度不如我那个。like 如果无法避免,就考虑用全文,不过全文低版本中准确性有点不靠谱,高版本没测过。另外对description这些字段,可以考虑把核心词提取出来放到一个列中做搜索键,加上索引,这样速度就快很多,
AMinfo 2013-12-31
  • 打赏
  • 举报
回复
引用 57 楼 DBA_Huangzj 的回复:
不纠结这个,速度能满足不?
用6多万条记录通过这种方法或者用4楼的方法测试,也是瞬间就出来了,关键的速度影响应该是在like %%这儿,补充一下,CPU和内存都是比较好的。
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
好吧,速度如何?
AMinfo 2013-12-31
  • 打赏
  • 举报
回复
引用 56 楼 DBA_Huangzj 的回复:
我这边测了才贴出来的,还有错...
消息 102,级别 15,状态 1,第 11 行 'id' 附近有语法错误。
AMinfo 2013-12-31
  • 打赏
  • 举报
回复
引用 1 楼 dotnetstudio 的回复:
你用下面的SQL返回的就是所有的ID结果啊

select id from tablename
我是在外部sql语句查询,查询得到的结果需要用rs.movenext循环方式获得,希望找到一种可以直接获取结果集的办法。
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
不纠结这个,速度能满足不?
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
我这边测了才贴出来的,还有错...
AMinfo 2013-12-31
  • 打赏
  • 举报
回复
引用 52 楼 DBA_Huangzj 的回复:
49楼的试试
49楼的代码有误,把from前面的id去掉后可执行,这个速度很快。
AMinfo 2013-12-31
  • 打赏
  • 举报
回复
用了全文检索后,通过内部存储查询处理893条记录,已经超过15分钟,还是正在查询中,看来无效。
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
全文的话要注意分词的准确性
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
49楼的试试
AMinfo 2013-12-31
  • 打赏
  • 举报
回复
引用 33 楼 yupeigu 的回复:
[quote=引用 32 楼 AMinfo 的回复:] [quote=引用 26 楼 yupeigu 的回复:] [quote=引用 8 楼 AMinfo 的回复:] [quote=引用 6 楼 yupeigu 的回复:] 那就只能一次把数据,全部加载到数组里面存储,然后就直接操作数组,不用每次在movenext取下一条数据。 这样可以节省每次与sql server交互的时间,加快处理速度
需要如何做?[/quote] 你用的是vb是吧,那就定义数组,然后连接上数据库,先把数据加载到内存,然后再循环处理,也就是就不需要再次从sql server取数据了: dim array_col1 as int dim array_col2 as string dim i int i = 1 do while not rs.movenext array_col1(i) = rs("id") array_col2(i) = rs("xx") rs.movenext [/quote] 谢谢!这种方式不可行的,数量太宠大了。[/quote] 因为一般的like '%xx%'没办法用索引,要是能用索引,就能提高速度了。 那就试试用全文检索技术,速度还是非常快的。[/quote] 嗯,正在试全文检索
AMinfo 2013-12-31
  • 打赏
  • 举报
回复
引用 48 楼 DBA_Huangzj 的回复:
SELECT CAST([MainDataBase].[dbo].[MainTable].SubId AS NVARCHAR) + ( SELECT ',' + CAST(t.ID AS NVARCHAR) FROM [SubDataBase].[dbo].[SubTable] t WHERE t.Description LIKE '%' + [MainDataBase].[dbo].[MainTable].Title + '%' FOR XML PATH('') ) 你这句能执行不?给我看看结果,从你UPDATE中抽出来的
消息 4104,级别 16,状态 1,第 1 行 无法绑定由多个部分组成的标识符 "MainDataBase.dbo.MainTable.SubId"。 消息 4104,级别 16,状态 1,第 5 行 无法绑定由多个部分组成的标识符 "MainDataBase.dbo.MainTable.Title"。
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
换一个方式,你看看这种会不会快一点
--> 测试数据:[tablename]
if object_id('[tablename]') is not null drop table [tablename]
go 
create table [tablename]([id] int,[Title] varchar(1))
insert [tablename]
select 1,'A' union all
select 2,'B' union all
select 3,'C' union all
select 4,'D' union all
select 5,'E' union all
select 6,'F'

   declare @S nvarchar(100)
    select @S=isnull(@S+',','')+CAST([id] AS VARCHAR) id from [tablename]
	SELECT @S
/*
id
----------------------------------------------------------------------------------------------------
1,2,3,4,5,6
*/
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
SELECT CAST([MainDataBase].[dbo].[MainTable].SubId AS NVARCHAR) + ( SELECT ',' + CAST(t.ID AS NVARCHAR) FROM [SubDataBase].[dbo].[SubTable] t WHERE t.Description LIKE '%' + [MainDataBase].[dbo].[MainTable].Title + '%' FOR XML PATH('') ) 你这句能执行不?给我看看结果,从你UPDATE中抽出来的
AMinfo 2013-12-31
  • 打赏
  • 举报
回复
引用 4 楼 weijia_liang 的回复:
select stuff ((select ','+id from tablename  FOR XML PATH('')),1,1,'')
这种方法也可以实现,但效率与我原来的方法是一样的,也差不多1秒1条,同样非常占CPU。
加载更多回复(59)

34,576

社区成员

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

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