SQL Server 2008 T-SQL UDF шансы и заканчивается - PullRequest
2 голосов
/ 10 мая 2011

Я пытаюсь взять строку данных из одного столбца и разделить ее на несколько разных столбцов в SQL Ser 2008. Пример: имя учетной записи 445566 0010020056893010445478008 AFD 369. Я использую функцию разделения с разделителями, которые работают отлично, отлично работает. Проблема в том, что я новичок в T-SQL и у меня есть несколько вопросов.

  1. Как заставить функцию проходить через полную таблицу, а не только строковый литерал?

  2. Это создает временную таблицу. Как вы берете эти значения и вставляете их в мою таблицу? Это просто оператор вставки?

Вот сценарий и использование:

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 Ответ

1 голос
/ 10 мая 2011

Чтобы использовать таблицу с значением 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...