我发现this function为以下查询返回三行:
select * from dbo.split('1 2 3',' ')
但是,我需要使用字段中的值而不是“1 2 3”。
我试过了:
select * from dbo.split(select top 1 myfield from mytable,' ')
但它没有说错误的语法。
它不必使用上述功能,因此请随意推荐其他功能或不同的方式来实现它。为了澄清,我只需要解析单个字段的单行中的值。
答案 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),' ')