我有一个表,它有一个值列,将数据列为: 第1行:'00','01','02','03' 第2行:'03','02','09','08'
我有几个分割功能
FUNCTION [dbo].[udf_Split](@String varchar(MAX), @Delimiter char(1))
returns @temptable TABLE (Item varchar(MAX))
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx<>0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Item) values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end return end;
我正在尝试使用该列创建表的视图,然后我希望我的视图结果是一个行列表,每个值都被破坏到它自己的行(并且不同)所以看起来像:(抽搐可以留下或去,现在不关心它们) 第1 00行 第2行:01 第3行:02 第4:03行
我的观点几乎是:
SELECT DISTINCT VALUE FROM TABLE
cross apply dbo.split(Value, ',') as Item
但它不起作用。有人能否就我应该如何工作向我提出一些指示?
答案 0 :(得分:3)
这是因为您SELECT
字段为VALUE
而不是Item.Item
。你应该这样做:
SELECT DISTINCT x.Item
FROM TABLE
CROSS APPLY dbo.split(Value, ',') AS x
此外,您的dbo.split
功能并非最佳。有许多方法可以以基于集合的方式拆分字符串,而不是RBAR。以下是使用XML的一种方法:
CREATE FUNCTION dbo.SplitStrings_XML
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);
GO
样本用法:
;WITH CteData(Value) AS(
SELECT '''00'',''01'',''02'',''03''' UNION ALL
SELECT '''03'',''02'',''09'',''08'''
)
SELECT DISTINCT x.Item
FROM CteData d
CROSS APPLY dbo.SplitStrings_XML(d.Value, ',') x
结果:
Item
--------
'00'
'01'
'02'
'03'
'08'
'09'
对于其他字符串拆分器,您可以阅读Aaron Bertrand的这个article。