Если нужен простой вариант хранения значений переменных в одной строке одного поля с разделителями без применения XML: MyDate=01.02.2010 ; Test=3; MyStringValue=This is a test!;
Лично мне это пригодилось при хранении нескольких настроек в одном поле, таким образом я избежал парсинга XML и не понадобилось бесконтрольно добавлять поля разного типа.
Создаем 2 функции [dbo].[fnSysGetParam] и [dbo].[fnSysGetParamValue].
Смотри пример в описании [dbo].[fnSysGetParamValue].
CREATE FUNCTION [dbo].[fnSysGetParam]
(@nvcInput nvarchar(500),
@intParamNum int,
@nvcDelimeter nvarchar(3))
RETURNS nvarchar(255)
AS
BEGIN
DECLARE @intI int,
@intJ int,
@intK int,
@nvcP nvarchar(100),
@nvcReturn nvarchar(255)
SET @intI =0
SET @intJ =0
SET @intK =0
SET @nvcP =''
SET @nvcReturn =''
IF (@nvcInput = '') OR (@intParamNum<1) OR (@intParamNum>LEN(@nvcInput)) OR (@nvcDelimeter='')
SET @nvcReturn = ''
ELSE
BEGIN
SET @intI=1
WHILE @intI <= Len(@nvcInput)
BEGIN
IF UPPER(SUBSTRING(@nvcInput,@intI,LEN(@nvcDelimeter)))=UPPER(@nvcDelimeter)
BEGIN
IF @nvcDelimeter=' '
BEGIN
SET @intK = @intI + 1
WHILE (@intK<=LEN(@nvcInput)) AND (UPPER(SUBSTRING(@nvcInput,@intK,LEN(@nvcDelimeter))) = UPPER(@nvcDelimeter))
SET @intK = @intK + 1
CONTINUE
SET @intI = @intK - 1
END
SET @intJ = @intJ + 1
If @intJ = @intParamNum
SET @nvcReturn = @nvcP
END
ELSE
BEGIN
IF (@intJ = @intParamNum - 1)
BEGIN
If @intJ = 0
SET @nvcP = @nvcP + SUBSTRING(@nvcInput, @intI, 1)
Else
SET @nvcP = @nvcP + SUBSTRING(@nvcInput, @intI + Len(@nvcDelimeter) - 1, 1)
END
END
SET @intI=@intI+1
CONTINUE
END
END
If @intJ = 0
SET @nvcReturn = @nvcInput
RETURN @nvcReturn
END
GO
CREATE FUNCTION [dbo].[fnSysGetParamValue]
(@nvcInput nvarchar(500),--строка оригинал
@nvcParamName nvarchar(100),--название параметра в строке
@nvcDelim nvarchar(1)) --символ конца параметра
RETURNS nvarchar(255)
AS
--Возвращает значение параметра из текстовой строки 'MyVar=10;'
--Пример: select dbo.fnSysGetParamValue('MyDate=01.02.2010 ;Test=3; MyFlag = 10','MyDate',';')
--Результат: 01.02.2010
BEGIN
DECLARE @nvcNewParam nvarchar(100)
SET @nvcNewParam = SUBSTRING(@nvcInput,CHARINDEX(@nvcParamName,@nvcInput),LEN(@nvcInput))
IF PATINDEX('%'+@nvcParamName+'%',@nvcNewParam)>0
BEGIN
SET @nvcNewParam = dbo.fnSysGetParam(@nvcNewParam,1,@nvcDelim) + '='
SET @nvcNewParam = RTRIM(LTRIM(dbo.fnSysGetParam(@nvcNewParam,2,'=')))
END
ELSE
SET @nvcNewParam = ''
RETURN ISNULL(@nvcNewParam,'')
END
GO
Лично мне это пригодилось при хранении нескольких настроек в одном поле, таким образом я избежал парсинга XML и не понадобилось бесконтрольно добавлять поля разного типа.
Создаем 2 функции [dbo].[fnSysGetParam] и [dbo].[fnSysGetParamValue].
Смотри пример в описании [dbo].[fnSysGetParamValue].
CREATE FUNCTION [dbo].[fnSysGetParam]
(@nvcInput nvarchar(500),
@intParamNum int,
@nvcDelimeter nvarchar(3))
RETURNS nvarchar(255)
AS
BEGIN
DECLARE @intI int,
@intJ int,
@intK int,
@nvcP nvarchar(100),
@nvcReturn nvarchar(255)
SET @intI =0
SET @intJ =0
SET @intK =0
SET @nvcP =''
SET @nvcReturn =''
IF (@nvcInput = '') OR (@intParamNum<1) OR (@intParamNum>LEN(@nvcInput)) OR (@nvcDelimeter='')
SET @nvcReturn = ''
ELSE
BEGIN
SET @intI=1
WHILE @intI <= Len(@nvcInput)
BEGIN
IF UPPER(SUBSTRING(@nvcInput,@intI,LEN(@nvcDelimeter)))=UPPER(@nvcDelimeter)
BEGIN
IF @nvcDelimeter=' '
BEGIN
SET @intK = @intI + 1
WHILE (@intK<=LEN(@nvcInput)) AND (UPPER(SUBSTRING(@nvcInput,@intK,LEN(@nvcDelimeter))) = UPPER(@nvcDelimeter))
SET @intK = @intK + 1
CONTINUE
SET @intI = @intK - 1
END
SET @intJ = @intJ + 1
If @intJ = @intParamNum
SET @nvcReturn = @nvcP
END
ELSE
BEGIN
IF (@intJ = @intParamNum - 1)
BEGIN
If @intJ = 0
SET @nvcP = @nvcP + SUBSTRING(@nvcInput, @intI, 1)
Else
SET @nvcP = @nvcP + SUBSTRING(@nvcInput, @intI + Len(@nvcDelimeter) - 1, 1)
END
END
SET @intI=@intI+1
CONTINUE
END
END
If @intJ = 0
SET @nvcReturn = @nvcInput
RETURN @nvcReturn
END
GO
CREATE FUNCTION [dbo].[fnSysGetParamValue]
(@nvcInput nvarchar(500),--строка оригинал
@nvcParamName nvarchar(100),--название параметра в строке
@nvcDelim nvarchar(1)) --символ конца параметра
RETURNS nvarchar(255)
AS
--Возвращает значение параметра из текстовой строки 'MyVar=10;'
--Пример: select dbo.fnSysGetParamValue('MyDate=01.02.2010 ;Test=3; MyFlag = 10','MyDate',';')
--Результат: 01.02.2010
BEGIN
DECLARE @nvcNewParam nvarchar(100)
SET @nvcNewParam = SUBSTRING(@nvcInput,CHARINDEX(@nvcParamName,@nvcInput),LEN(@nvcInput))
IF PATINDEX('%'+@nvcParamName+'%',@nvcNewParam)>0
BEGIN
SET @nvcNewParam = dbo.fnSysGetParam(@nvcNewParam,1,@nvcDelim) + '='
SET @nvcNewParam = RTRIM(LTRIM(dbo.fnSysGetParam(@nvcNewParam,2,'=')))
END
ELSE
SET @nvcNewParam = ''
RETURN ISNULL(@nvcNewParam,'')
END
GO