Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 3.35 KB | None | 0 0
  1. /* ----------------------------------------- */
  2. 1. Почему ты используешь patindex вместо charindex - ты же ищешь всего лишь один символ, charindex - быстрее будет в данном случае
  3.  
  4. 2. По поводу твоих переменных, я так понимаю, они должны потом проинсертиться в одно поле таблице (иначе ты не задавала бы такой вопрос, имея все переменные на руках, т.е. кол-во значений может варьироваться), для этого тебе нужна функция с табличным результатом, т.е. приблизительно такого вида:
  5.  
  6. CREATE FUNCTION dbo.get_delimeted_strings(@delimiter char, @string varchar(max))
  7. RETURNS @retStrings TABLE
  8. (
  9.     ItemIndex int,
  10.     Item varchar(max) -- max-можешь заменить на нужную длину
  11.               -- "max" indicates that the maximum storage size is 2^31-1 bytes, работает начиная с 2005
  12. )
  13. AS
  14. BEGIN
  15.     DECLARE
  16.         @Index int,
  17.         @Item varchar(max)
  18.     SET @Index = 0
  19.  
  20.     DECLARE
  21.         @pos int
  22.  
  23.     IF RIGHT(RTRIM(@string),1) <> @delimiter
  24.         SET @string = @string  + @delimiter
  25.     SET @pos =  CHARINDEX(@delimiter, @string)
  26.  
  27.     WHILE @pos <> 0
  28.     BEGIN
  29.         SET @Index = @Index + 1
  30.         SET @Item = LEFT(@string, @pos - 1)
  31.         insert into @retStrings(ItemIndex, Item) VALUES (@Index, @Item)
  32.  
  33.         SET @string = SUBSTRING(@string, 1, @pos) // я заменил на SUBSTRING ( expression ,start , length )
  34.  
  35.         SET @pos =  CHARINDEX(@delimiter, @string)
  36.  
  37.     END
  38. END
  39.  
  40. // как то так.... проверь
  41. // select * from dbo.get_delimeted_strings('•', '3 р.•постійно•постійно•доки не мине потреба')
  42.  
  43.  
  44.  
  45. DECLARE
  46. @string VARCHAR(800),
  47. @set1   VARCHAR(800),
  48. @set2   VARCHAR(800),
  49. @set3   VARCHAR(800),
  50. @set4   VARCHAR(800),
  51. @i      int = 0
  52.  
  53. SET @string = '3 р.•постійно•постійно•доки не мине потреба'
  54.  
  55. DECLARE @pos INT
  56. DECLARE @piece VARCHAR(800)
  57.  
  58. IF right(rtrim(@string),1) <> '•'
  59.  SET @string = @string  + '•'
  60.  SET @pos =  patindex('%•%', @string)
  61. WHILE @pos <> 0
  62. BEGIN
  63.  SET @i = @i+1
  64.  SET @piece = left(@string, @pos - 1)
  65.  
  66.  IF @i = 1
  67.  SET @set1 = cast(@piece as varchar(500))
  68.  IF @i = 2
  69.  SET @set2 = cast(@piece as varchar(500))
  70.  IF @i = 3
  71.  SET @set3 = cast(@piece as varchar(500))
  72.  IF @i = 4
  73.  SET @set4 = cast(@piece as varchar(500))
  74.  
  75.  SET @string = stuff(@string, 1, @pos, '')
  76.  SET @pos =  patindex('%•%', @string)
  77. END
  78.  
  79. SELECT @set1, @set2, @set3, @set4
  80.  
  81. -- мне нужны эти переменные (@set1, @set2, @set3, @set4) для последующего инсерта в таблицу с остальными данными (вчерашняя моя загадка), но я не знаю как мне их цивильно собрать. оптимально было бы функцию сделать.. я хотела таблицу вернуть из функции, но не придумала как это все чудо завернуть в один селект.
  82. -- на входе у меня есть только строка, которую нужно парсить и вернуть как 4 переменные.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement