SQL Server 2008 T-SQL UDF赔率和结束

时间:2011-05-10 19:15:57

标签: tsql sql-server-2008

我正在尝试从一列中获取数据字符串并将其拆分为SQL Ser 2008中的几个不同的列。例如:名称帐户445566 0010020056893010445478008 AFD 369.我正在使用借用的空格分隔功能,该功能非常好用。问题是我是T-SQL的新手并且有一些问题。

  1. 如何使函数运行完整的表而不仅仅是字符串文字?

  2. 这会生成一个temparary表,如何获取这些值并将它们插入到我的表中?它只是一个插入声明吗?

  3. 以下是脚本和用法:

    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 个答案:

答案 0 :(得分: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