2010-01-19 34 views
3

我发现this function它返回以下查询三行:如何将空格分隔字段拆分为SQL Server中的行?

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

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

我想:

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

但它没有说的语法不正确。

它不必使用上面的功能,所以随意推荐其他功能或不同的方式去解决它。为了澄清,我只需要解析单个字段单行中的值。

回答

2

你试过

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

不能使用表值函数这样。 OP明确指出函数'返回三行',所以不是标量。 – 2010-01-19 20:52:35

+0

嗨,彼得,谢谢你的回答。但是,看起来Remus是对的。我得到这个错误:找不到列“dbo”或用户定义的函数或聚合“dbo.split”,或名称不明确。 – BrianM 2010-01-19 22:00:04

0

把UDF周围的列,例如

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

你需要的分裂(MyField的)功能,适用于每一行mytable的。当分割功能是表值函数的正确答案是APPLY操作:

The APPLY operator allows you to invoke a table-valued function for each row returned by an outer table expression of a query.

那么答案一定是:

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, @[email protected]+1)); 
    set @i = @n+1; 
    end 
    return; 
end 
go 

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

试过你的解决方案,它没有工作。返回的错误是:“srgspossiblevalues”(这是我的字段的名称)不是一个可识别的表提示选项。我将澄清这个问题,以表明我只需要解析一个单元格中的值。 – BrianM 2010-01-19 21:55:23

+0

您正在将我的示例错误地转换为您的代码。没有任何表格提示。我已经将我的示例扩展为完整的运行代码示例。 – 2010-01-19 22:19:34

+0

Remus - 感谢您的回复。 我尝试使用你的功能,并得到相同的错误。其实,对于踢腿,我删除了拆分功能,并运行你的整个代码块,看看它是否会工作。它返回了与表提示相同的错误:“myfield”不是一个可识别的表提示选项。 鉴于我对高级sql的经验不足,我很可能仍然在做错误或误解您的解决方案。感谢您的耐心和帮助。 – BrianM 2010-01-19 22:54:16

1
EXEC SP_DBCMPTLEVEL 'YOUR_DB_NAME',90; 

应该修复Remu​​s的不兼容代码问题。我只是看着我自己的数据库,它被设置为'80',这意味着它支持< = SQL 2000.应用上述过程后,代码运行并完美工作。

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

这个MSDN链接将帮助您确定您的FN/USP /应用层将受到负面影响:http://msdn.microsoft.com/en-us/library/bb510680.aspx

0

尝试

select * from dbo.split((select top 1 myfield from mytable),' ') 
相关问题