SQL Server 2008 T-SQL UDF разные варианты

#tsql #sql-server-2008

#tsql #sql-server-2008

Вопрос:

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

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

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

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

 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 с табличным значением для таблицы, вам нужно ПЕРЕКРЕСТНО ПРИМЕНИТЬ (или, возможно, ВНЕШНЕЕ ПРИМЕНЕНИЕ, в зависимости от того, как вы хотите работать с «отсутствием строк» из 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 
  

Комментарии:

1. Отлично! Я попробую. Я подумал, что могу на секунду поставить stack в тупик. Спасибо за помощь!

2. Выглядит неплохо, но одна ошибка. Для процедуры или функции dbo было предоставлено недостаточное количество аргументов. Разделение.

3. Ах да, извините. Просто нужно добавить разделитель в качестве второго параметра

4. Очень приятно! Очень полезно, еще раз спасибо!

5. И, кажется, я могу избавиться от пустых строк с помощью where rtrim(s.stringValue) != »