2011-05-10 36 views
2

我想從一列中取數據字符串,並將其分割成SQL Ser 2008中的幾個不同的列。示例:名稱帳戶445566 0010020056893010445478008 AFD 369.我正在使用借用空間劃分功能,這非常有效。問題是我是T-SQL的新手,並且有幾個問題。SQL Server 2008的T-SQL的UDF的幾何和目的

  1. 我該如何讓函數在整個表中運行,而不僅僅是一個字符串文字?

  2. 這生成一個temparary表你如何把這些值並插入到我的表中?它只是一個插入語句?

這是劇本和用法:

CREATE FUNCTION [dbo].[Split] 
( 
@String varchar(max) 
,@Delimiter char 
) 
RETURNS @Results table 
( 
Ordinal int 
,StringValue varchar(max) 
) 
as 
begin 

set @String = isnull(@String,'') 
set @Delimiter = isnull(@Delimiter,'') 

declare 
@TempString varchar(max) = @String 
,@Ordinal int = 0 
,@CharIndex int = 0 

set @CharIndex = charindex(@Delimiter, @TempString) 
while @CharIndex != 0 begin  
    set @Ordinal += 1   
    insert @Results values 
    ( 
    @Ordinal 
    ,substring(@TempString, 0, @CharIndex) 
    )   
    set @TempString = substring(@TempString, @CharIndex + 1, len(@TempString) - @CharIndex)  
    set @CharIndex = charindex(@Delimiter, @TempString) 
end 

if @TempString != '' begin 
    set @Ordinal += 1 
    insert @Results values 
    ( 
    @Ordinal 
    ,@TempString 
    ) 
end 

return 
end 

--USAGE 
select 
s.* 
from dbo.Split('Name Account 445566 0010020056893010445478008 AFD 369', ' ') as s 
where rtrim(s.StringValue) != '' 
GO 

回答

1

要使用價值UDF表對錶,你需要CROSS APPLY(或者OUTER取決於您希望如何處理APPLY「無行「來自udf)。這適用於對你的表UDF這本身就是一個表

SELECT 
    * 
FROM 
    mytable M 
    CROSS APPLY 
    [dbo].[Split] (M.TheColumn) S 

的行由行操作來插入

INSERT AnotherTable (col1, col2, ...) 
SELECT 
    col1, col2, ... 
FROM 
    mytable M 
    CROSS APPLY 
    [dbo].[Split] (M.TheColumn) S 
+0

不錯!我會試一試。我想我可能會在那裏堆棧一秒鐘。感謝您的幫助! – 2boolORNOT2bool 2011-05-10 19:55:00

+0

看起來不錯,但有一個錯誤。爲過程或函數dbo.Split提供的參數數量不足。 – 2boolORNOT2bool 2011-05-10 20:01:30

+0

啊,是的,對不起。只需要添加分隔符作爲第二個參數 – gbn 2011-05-10 20:02:59