拆分SELECT语句,提取数值

weiAnna 2014-11-17 09:40:41
传入参数:
@select = 'select * from fram.statisticdata where wfid in(100001,100002,100003) and wtid in(100001001,100001002,100002001,100002004,100003003) and (rectime >='2014-11-1' and rectime <='2014-11-17')


1。要求提取出@select里的

100001
100002
100003
放到游标里。

2。在提取出
100001001
100001002
100002001
100002004
100003003
放到临时表,

3。提取出rectime >='2014-11-1' and rectime <='2014-11-17'做WHERE条件。

请教我用什么方式提取,这三个条件的顺序没有固定的。请高手指教。


...全文
166 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2014-11-17
  • 打赏
  • 举报
回复
DECLARE @select varchar(max)
DECLARE @i1 int
DECLARE @i2 int
DECLARE @str varchar(100)

SET @select = 'select * from fram.statisticdata
where wfid in(100001,100002,100003)
and wtid in(100001001,100001002,100002001,100002004,100003003)
and (rectime >=''2014-11-1'' and rectime <=''2014-11-17'')'

SET @i1 = CHARINDEX('(',@select,1)
SET @i2 = CHARINDEX(')',@select,@i1+1)
SET @str = SUBSTRING(@select,@i1+1,@i2-@i1-1)
SELECT * FROM f_split(@str,',') --你自己做成游标

SET @i1 = CHARINDEX('(',@select,@i2+1)
SET @i2 = CHARINDEX(')',@select,@i1+1)
SET @str = SUBSTRING(@select,@i1+1,@i2-@i1-1)
SELECT * FROM f_split(@str,',') --你自己放到临时表

SET @i1 = CHARINDEX('(',@select,@i2+1)
SET @i2 = CHARINDEX(')',@select,@i1+1)
SET @str = SUBSTRING(@select,@i1,@i2-@i1+1)
PRINT @str --WHERE 条件

f_split
中国风 2014-11-17
  • 打赏
  • 举报
回复
条件1、2为同一列只会重复执行,没有意义
还在加载中灬 2014-11-17
  • 打赏
  • 举报
回复
--SQL处理字符串不是很强,建议在程序上处理
--以下仅供参考
--以下方法有个约束,即where,and和条件的间隔为固定空格1
DECLARE @select VARCHAR(200)
SET @select='select * from fram.statisticdata where wfid in(100001,100002,100003) and wtid in(100001001,100001002,100002001,100002004,100003003) and (rectime >=''2014-11-1'' and rectime <=''2014-11-17'')'
--去掉where加个and,规范语句
SET @select='and'+STUFF(@select,1,CHARINDEX('where',@select)+4,'')

DECLARE @START INT,@END INT
SET @START=CHARINDEX('wfid in(',@select)+8
SET @END=CHARINDEX(')',@select,@START)
DECLARE @XML XML
SET @XML=CONVERT(XML,'<V>'+REPLACE(SUBSTRING(@select,@START,@END-@START),',','</V><V>')+'</V>')
--DECLARE TESTCURSOR CURSOR SCROLL FOR
--直接在这儿加游标即可
SELECT N.V.value('.','VARCHAR(20)') FROM @XML.nodes('//V')N(V)
--清除该查询条件
SET @select=STUFF(@select,@START-8-4,@END-@START+9+5,'')

SET @START=CHARINDEX('wtid in(',@select)+8
SET @END=CHARINDEX(')',@select,@START)
SET @XML=CONVERT(XML,'<V>'+REPLACE(SUBSTRING(@select,@START,@END-@START),',','</V><V>')+'</V>')
--在这添加到临时表
SELECT N.V.value('.','VARCHAR(20)')--INTO #临时表
FROM @XML.nodes('//V')N(V)
--也清除该查询条件
SET @select=STUFF(@select,@START-8-4,@END-@START+9+5,'')

--整理出最后的条件
SET @select=STUFF(@select,1,4,'')
SELECT @select
weiAnna 2014-11-17
  • 打赏
  • 举报
回复
我是想把里面的数据值提出来放到临时表或是游标呀,类似的。就是能提取出来那些数值就行。
--小F-- 2014-11-17
  • 打赏
  • 举报
回复
没看懂意思 你是想纵向拆分还是什么意思?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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