Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 3.36 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.     RETURN
  39. END
  40.  
  41. // как то так.... проверь
  42. // select * from dbo.get_delimeted_strings('•', '3 р.•постійно•постійно•доки не мине потреба')
  43.  
  44.  
  45.  
  46. DECLARE
  47. @string VARCHAR(800),
  48. @set1   VARCHAR(800),
  49. @set2   VARCHAR(800),
  50. @set3   VARCHAR(800),
  51. @set4   VARCHAR(800),
  52. @i      int = 0
  53.  
  54. SET @string = '3 р.•постійно•постійно•доки не мине потреба'
  55.  
  56. DECLARE @pos INT
  57. DECLARE @piece VARCHAR(800)
  58.  
  59. IF right(rtrim(@string),1) <> '•'
  60.  SET @string = @string  + '•'
  61.  SET @pos =  patindex('%•%', @string)
  62. WHILE @pos <> 0
  63. BEGIN
  64.  SET @i = @i+1
  65.  SET @piece = left(@string, @pos - 1)
  66.  
  67.  IF @i = 1
  68.  SET @set1 = cast(@piece as varchar(500))
  69.  IF @i = 2
  70.  SET @set2 = cast(@piece as varchar(500))
  71.  IF @i = 3
  72.  SET @set3 = cast(@piece as varchar(500))
  73.  IF @i = 4
  74.  SET @set4 = cast(@piece as varchar(500))
  75.  
  76.  SET @string = stuff(@string, 1, @pos, '')
  77.  SET @pos =  patindex('%•%', @string)
  78. END
  79.  
  80. SELECT @set1, @set2, @set3, @set4
  81.  
  82. -- мне нужны эти переменные (@set1, @set2, @set3, @set4) для последующего инсерта в таблицу с остальными данными (вчерашняя моя загадка), но я не знаю как мне их цивильно собрать. оптимально было бы функцию сделать.. я хотела таблицу вернуть из функции, но не придумала как это все чудо завернуть в один селект.
  83. -- на входе у меня есть только строка, которую нужно парсить и вернуть как 4 переменные.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement