如何在不创建函数的情况下在SQL Server中拆分分隔字符串?

Tod*_*odd 15 sql-server

我正在使用SQL Server数据库.我有一个包含分隔列表的列,我需要编写一个查询,将列表的值拆分为行.从浏览StackOverflow和网络的其余部分,我知道这是一个常见的问题.事实上,我在这里找到了一个广泛的分析:

http://www.sommarskog.se/arrays-in-sql.html

不幸的是,我在该网站和其他地方看到的每个解决方案都要求我创建一个功能.这不是我的选择 - 我缺乏使用CREATE命令所需的权限.

没有CREATE,我知道我可以使用PARSENAME函数,就像这样(感谢Nathan Bedford 如何分割字符串以便我可以访问项目x?):

SELECT PARSENAME(REPLACE('Hello John Smith', ' ', '.'), 2) 
Run Code Online (Sandbox Code Playgroud)

但是,PARSENAME仅适用于4个或更少项目的列表.因此,我的问题是:如何在不在数据库中创建新对象的情况下编写查询来拆分超过4个项目的分隔字符串?

编辑:

感谢大家的快速解答.我可能遗漏了一些重要信息 - 我通过ODBC连接与数据库进行交互.除了CREATE语句之外,似乎还有其他语句不起作用.例如,我似乎无法在一个语句中使用DECLARE来定义将在另一个语句中使用的变量.尽可能接近我的想法,我必须将所有内容都放在一个SELECT语句中(尽管WITH似乎也适用于声明公共表).不幸的是,到目前为止所提出的所有解决方案似乎都需要在SELECT语句之外进行变量声明,而这是不起作用的.请忍受我 - 我正在学习.

Mik*_*son 16

使用XML的版本.

declare @S varchar(100) = 'Hello John Smith'

select 
  n.r.value('.', 'varchar(50)')
from (select cast('<r>'+replace(@S, ' ', '</r><r>')+'</r>' as xml)) as s(XMLCol)
  cross apply s.XMLCol.nodes('r') as n(r)
Run Code Online (Sandbox Code Playgroud)

使用表格替换@T为您正在使用的表格.

-- Test table
declare @T table (ID int, Col varchar(100))
insert into @T values (1, 'Hello John Smith')
insert into @T values (2, 'xxx yyy zzz')

select 
  T.ID,
  n.r.value('.', 'varchar(50)')
from @T as T
  cross apply (select cast('<r>'+replace(replace(Col,'&','&amp;'), ' ', '</r><r>')+'</r>' as xml)) as S(XMLCol)
  cross apply S.XMLCol.nodes('r') as n(r)
Run Code Online (Sandbox Code Playgroud)

'Hello John Smith'不使用变量的情况下拆分字符串

select 
  n.r.value('.', 'varchar(50)')
from (select cast('<r>'+replace('Hello John Smith', ' ', '</r><r>')+'</r>' as xml)) as s(XMLCol)
  cross apply s.XMLCol.nodes('r') as n(r)
Run Code Online (Sandbox Code Playgroud)


SQL*_*ace 7

使用内置master..spt_values表的示例

DECLARE @String VARCHAR(1000)
    SELECT @String ='1,4,77,88,4546,234,2,3,54,87,9,6,4,36,6,9,9,6,4,4,68,9,0,5'

    SELECT SUBSTRING(',' + @String + ',', Number + 1,
    CHARINDEX(',', ',' + @String + ',', Number + 1) - Number -1)AS VALUE
    FROM master..spt_values
    WHERE Type = 'P'
    AND Number <= LEN(',' + @String + ',') - 1
    AND SUBSTRING(',' + @String + ',', Number, 1) = ','
    GO
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见此处:使用数字表拆分字符串