Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* ----------------------------------------- */
- 1. Почему ты используешь patindex вместо charindex - ты же ищешь всего лишь один символ, charindex - быстрее будет в данном случае
- 2. По поводу твоих переменных, я так понимаю, они должны потом проинсертиться в одно поле таблице (иначе ты не задавала бы такой вопрос, имея все переменные на руках, т.е. кол-во значений может варьироваться), для этого тебе нужна функция с табличным результатом, т.е. приблизительно такого вида:
- CREATE FUNCTION dbo.get_delimeted_strings(@delimiter char, @string varchar(max))
- RETURNS @retStrings TABLE
- (
- ItemIndex int,
- Item varchar(max) -- max-можешь заменить на нужную длину
- -- "max" indicates that the maximum storage size is 2^31-1 bytes, работает начиная с 2005
- )
- AS
- BEGIN
- DECLARE
- @Index int,
- @Item varchar(max)
- SET @Index = 0
- DECLARE
- @pos int
- IF RIGHT(RTRIM(@string),1) <> @delimiter
- SET @string = @string + @delimiter
- SET @pos = CHARINDEX(@delimiter, @string)
- WHILE @pos <> 0
- BEGIN
- SET @Index = @Index + 1
- SET @Item = LEFT(@string, @pos - 1)
- insert into @retStrings(ItemIndex, Item) VALUES (@Index, @Item)
- SET @string = SUBSTRING(@string, 1, @pos) // я заменил на SUBSTRING ( expression ,start , length )
- SET @pos = CHARINDEX(@delimiter, @string)
- END
- RETURN
- END
- // как то так.... проверь
- // select * from dbo.get_delimeted_strings('•', '3 р.•постійно•постійно•доки не мине потреба')
- DECLARE
- @string VARCHAR(800),
- @set1 VARCHAR(800),
- @set2 VARCHAR(800),
- @set3 VARCHAR(800),
- @set4 VARCHAR(800),
- @i int = 0
- SET @string = '3 р.•постійно•постійно•доки не мине потреба'
- DECLARE @pos INT
- DECLARE @piece VARCHAR(800)
- IF right(rtrim(@string),1) <> '•'
- SET @string = @string + '•'
- SET @pos = patindex('%•%', @string)
- WHILE @pos <> 0
- BEGIN
- SET @i = @i+1
- SET @piece = left(@string, @pos - 1)
- IF @i = 1
- SET @set1 = cast(@piece as varchar(500))
- IF @i = 2
- SET @set2 = cast(@piece as varchar(500))
- IF @i = 3
- SET @set3 = cast(@piece as varchar(500))
- IF @i = 4
- SET @set4 = cast(@piece as varchar(500))
- SET @string = stuff(@string, 1, @pos, '')
- SET @pos = patindex('%•%', @string)
- END
- SELECT @set1, @set2, @set3, @set4
- -- мне нужны эти переменные (@set1, @set2, @set3, @set4) для последующего инсерта в таблицу с остальными данными (вчерашняя моя загадка), но я не знаю как мне их цивильно собрать. оптимально было бы функцию сделать.. я хотела таблицу вернуть из функции, но не придумала как это все чудо завернуть в один селект.
- -- на входе у меня есть только строка, которую нужно парсить и вернуть как 4 переменные.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement