понедельник, 2 февраля 2009 г.

Разбор строки с разделителями

Разбор строки с разделителями это задача с которой рано или поздно сталкивается любой программист баз данных. Обычно для этого пишут табличную функцию на tsql.
С появлением новых версий SQL Server появились альтернативные варианты. Например вместо обычной tsql процедуры можно использовать хранимую процедуру на CLR. Пример и стравнение с вариантом на t-sql можно посмотреть в статье SQL Server CLR and T-SQL functions to parse a delimited string , в коментариях к той же статье приведёны примеры разбора строки с разделителями с использованием CTE.
Далее пример функции преобразования строки в таблицу на t-sql взятый тут

CREATE FUNCTION [dbo].[udf_ConvertStrToTable]
(
@ParamaterList VARCHAR(MAX),
@Delimiter CHAR(1)
)
RETURNS @ReturnList TABLE
(
FieldValue VARCHAR(MAX)
)
AS BEGIN
DECLARE @ArrayList TABLE
(
FieldValue VARCHAR(MAX)
)
DECLARE @Value VARCHAR(MAX)
DECLARE @CurrentPosition INT

SET @ParamaterList = LTRIM(RTRIM(@ParamaterList))
+ CASE WHEN RIGHT(@ParamaterList, 1) = @Delimiter THEN ''
ELSE @Delimiter
END
SET @CurrentPosition = ISNULL(CHARINDEX(@Delimiter, @ParamaterList, 1), 0)

IF @CurrentPosition = 0
INSERT INTO @ArrayList ( FieldValue )
SELECT @ParamaterList
ELSE
BEGIN
WHILE @CurrentPosition > 0
BEGIN
SET @Value = LTRIM(RTRIM(LEFT(@ParamaterList,
@CurrentPosition - 1))) --make sure a value exists between the delimiters
IF LEN(@ParamaterList) > 0
AND @CurrentPosition <= LEN(@ParamaterList)
BEGIN
INSERT INTO @ArrayList ( FieldValue )
SELECT @Value
END
SET @ParamaterList = SUBSTRING(@ParamaterList,
@CurrentPosition
+ LEN(@Delimiter),
LEN(@ParamaterList))
SET @CurrentPosition = CHARINDEX(@Delimiter,
@ParamaterList, 1)
END
END
INSERT @ReturnList ( FieldValue )
SELECT FieldValue
FROM @ArrayList
RETURN
END

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

Locations of visitors to this page