我有一个名为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
答案 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