Посмотрите, может ли это помочь. Кроме того, дайте мне знать, если вы хотите, чтобы я объяснил код.
IF EXISTS(SELECT 1 FROM SYS.OBJECTS WHERE NAME = 'fn_GetAttributeAndValueFromLongText' AND TYPE = 'TF')
BEGIN
DROP FUNCTION dbo.fn_GetAttributeAndValueFromLongText
END
GO
CREATE FUNCTION dbo.fn_GetAttributeAndValueFromLongText ( @String_LongText VARCHAR(MAX) )
RETURNS @TBL_Attribute_Value TABLE
(
Attribute VARCHAR(MAX)
, Value VARCHAR(MAX)
)
AS
BEGIN
DECLARE @ATTR_VALUE_DELIMITER AS VARCHAR(MAX) = ':'
WHILE (RTRIM(LTRIM(LEN(@String_LongText))) != 0)
BEGIN
DECLARE @String_ATTR VARCHAR(MAX)='', @String_VALUE VARCHAR(MAX)= ''
SELECT @String_LongText = RTRIM(LTRIM(@String_LongText))
SELECT @String_ATTR = SUBSTRING(@String_LongText, 1,CHARINDEX(':',@String_LongText)-1)
SELECT @String_LongText = RIGHT(@String_LongText, LEN(@String_LongText)-(LEN(@String_ATTR)+1))
IF @String_LongText LIKE '%'+@ATTR_VALUE_DELIMITER+'%'
BEGIN
SELECT @String_VALUE = LEFT(SUBSTRING(@String_LongText, 1, CHARINDEX(':', @String_LongText)-1), LEN(SUBSTRING(@String_LongText, 1, CHARINDEX(':', @String_LongText)-1)) - CHARINDEX(',', REVERSE(SUBSTRING(@String_LongText, 1, CHARINDEX(':', @String_LongText)-1))))
SELECT @String_LongText = RIGHT(@String_LongText, LEN(@String_LongText)-(LEN(@String_VALUE)+1))
END
ELSE
BEGIN
SELECT @String_VALUE = @String_LongText
SELECT @String_LongText = REPLACE(@String_LongText, @String_VALUE, '')
END
INSERT INTO @TBL_Attribute_Value ([Attribute], [Value])
VALUES(RTRIM(LTRIM(@String_ATTR)), RTRIM(LTRIM(@String_VALUE)))
END
RETURN
END
GO
SELECT * FROM dbo.fn_GetAttributeAndValueFromLongText('TYPE: SOLID WEDGE 1,SOLID WEDGE 2, VALVE SIZE: 1 IN, PRESSURE RATING: 800 LB, CONNECTION TYPE: SOCKET WELD, BONNET STYLE: BOLTED')