#tsql #sql-server-2008
#tsql #sql-server-2008
Вопрос:
Я пытаюсь взять строку данных из одного столбца и разделить ее на несколько разных столбцов в SQL Ser 2008. Пример: Имя учетной записи 445566 0010020056893010445478008 AFD 369. Я использую заимствованную функцию разделения, разделенную пробелом, которая отлично работает. Проблема в том, что я новичок в T-SQL и у меня есть несколько вопросов.
-
Как мне заставить функцию работать по всей таблице, а не только по строковому литералу?
-
Это генерирует временную таблицу как вы берете эти значения и вставляете их в мою таблицу? Это просто инструкция 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) != »