如何将空格分隔的字段拆分为SQL Server中的行?

时间:2010-01-19 20:40:03

标签: sql sql-server sql-server-2005

我发现this function为以下查询返回三行:

select * from dbo.split('1 2 3',' ') 

但是,我需要使用字段中的值而不是“1 2 3”。

我试过了:

select * from dbo.split(select top 1 myfield from mytable,' ')

但它没有说错误的语法。

它不必使用上述功能,因此请随意推荐其他功能或不同的方式来实现它。为了澄清,我只需要解析单个字段的单行中的值。

5 个答案:

答案 0 :(得分:3)

您需要将split(myfield)函数应用于mytable中的每一行。当split函数是表值函数时,正确的答案是APPLY运算符:

  

APPLY运算符允许您   为...调用表值函数   外表返回的每一行   查询的表达。

所以答案必须是:

select *
from mytable 
cross apply dbo.split(myfield, ' ');

示例:

create table mytable (myfield varchar(10));
insert into mytable (myfield) values ('1 2 3');
go

create function split (@list varchar(max), @delimiter char(1))
returns @shards table (value varchar(8000))
with schemabinding
as
begin
  declare @i int;
  set @i = 0;
  while @i <= len(@list)
  begin
    declare @n int;
    set @n = charindex(@delimiter, @list, @i);
    if 0 = @n
    begin
       set @n = len(@list);
    end
    insert into @shards (value) 
      values (substring(@list, @i, @n-@i+1));
    set @i = @n+1;
  end
  return;
end
go

select * 
from mytable  
cross apply dbo.split(myfield, ' ');

答案 1 :(得分:2)

你试过吗

SELECT dbo.split(myfield, ' ') AS x FROM mytable

答案 2 :(得分:1)

EXEC SP_DBCMPTLEVEL 'YOUR_DB_NAME',90;

应该解决Remus不兼容代码的问题。我只是查看了我自己的数据库,并将其设置为'80'级别,这意味着它支持&lt; = SQL 2000.应用上述过程后,代码运行并完美运行。

现在我只需要找出wtf依赖于SQL2000并在SQL2005中打破... AHH!

此MSDN链接可帮助您确定您的fn / usp / app图层是否会受到负面影响:http://msdn.microsoft.com/en-us/library/bb510680.aspx

答案 3 :(得分:0)

将UDF放在您的列周围,例如

SELECT dbo.split(myfield, ' ')  as SplitValue
FROM mytable

答案 4 :(得分:0)

尝试

select * from dbo.split((select top 1 myfield from mytable),' ')