使用While循环将子字符串值插入SQL临时表?

时间:2015-11-20 21:03:12

标签: sql-server

我有一个名为accountNumbers的表。表中的值的示例是:

01-005-000-000-001-000

01-005-311-097-000

001-005-105-545

我想要做的是在短划线处拆分列(accountNum),然后将该值插入临时表#test。打印出#test时,它应该如下所示:

01

005

000

001

311

097

等等。我不能使用商店程序或功能。我可以获得第一个值,但是我尝试的任何while循环都会反复打印第一行。

WHILE @@ROWCOUNT > (select count(*) from dbo.accountNumbers
BEGIN
  insert into #test (split, accountNum)
  select SUBSTRING(accountNum, 1, CHARINDEX('-', accountNum) -1), accountNum
  from dbo.accountNumbers
END

1 个答案:

答案 0 :(得分:2)

没有任何函数或过程的限制似乎有点奇怪,但您不必使用函数来执行此操作。可以使用http://sqlperformance.com/2012/07/t-sql-queries/split-strings对此处的XML函数进行非常小的调整,因此您无需使用函数来执行此操作。

if OBJECT_ID('tempdb..#something') is not null
    drop table #something

create table #something
(
    AccountNumbers varchar(100)
)
insert #something
select '01-005-000-000-001-000' union all
select '01-005-311-097-000' union all
select '001-005-105-545'

select *
from #something s
cross apply
(
    SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(s.AccountNumbers, '-', '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
)MySplit