как разделить / учитывать 3 символа в каждой строке

#sql-server-2008 #sql-server-2012

#sql-server-2008 #sql-server-2012

Вопрос:

Привет, у меня есть одно сомнение в sql server

как разделить длину от 3 до последних символов в sql server

 table : emp 
id  | name  
1   | harikrishnaxx
2   | Baludevu
 

на основе приведенных выше данных я хочу получить вывод, как показано ниже :

 id  | name 
1   | har
1   |ikr
1   |ish
1   |nax
1   |x
2   | bal
2   |ude
2   |vu
 

я попробовал, как показано ниже :
1-й я создаю функцию tablevalued, затем вызываю эту функцию в таблице emp

 create  FUNCTION DatesBetween(@name varchar(50))
RETURNS @dates TABLE (
   DateValue varchar(50)  NULL
) 
AS
BEGIN
declare @fin varchar(50)
declare @len int = (select len(@name))
declare @i int 
set @i=1
while (@i <=@len)
begin
insert into @dates (DateValue)values(@fin)
set  @fin =SUBSTRING (@name ,@i,3)
set @i=@i 3
   END;
 RETURN;
END;

select  id ,   dbo.DatesBetween(name ) from emp 
 

но приведенный выше запрос не дает точного результата.
не могли бы вы рассказать мне, как решить эту проблему в sql server

Ответ №1:

Создайте эту встроенную пользовательскую функцию с табличным значением, которая может адаптироваться к любому размеру, который вы хотите, чтобы ваши фрагменты были:

 CREATE OR ALTER FUNCTION dbo.ChunkNames(@name varchar(50), @len int)
RETURNS TABLE
AS
  RETURN 
  (
    WITH n(n) AS 
    (
      SELECT n=1 UNION ALL 
      SELECT n 1 FROM n 
        WHERE n < LEN(@name)/@len
                CASE LEN(@name)%@len WHEN 0 THEN 0 
                ELSE 1 END
    )
    SELECT n, chunk = SUBSTRING(@name,(n-1)*@len 1,@len) FROM n
  );
GO
 

Теперь, со следующими примерами данных:

 CREATE TABLE #emp
(id int, name sysname);

INSERT #emp(id,name) VALUES(1,'harikrishnaxx'),
  (2,'Baludevu'),(3,'woo'),(4,'booboo');
 

Затем с помощью этого запроса:

 SELECT e.id, name = f.chunk 
  FROM #emp AS e
  CROSS APPLY dbo.ChunkNames(e.name,3) AS f
  ORDER BY e.id, f.n;
 

Вы получите следующие результаты:

 id  name
--  ----
1   har
1   ikr
1   ish
1   nax
1   x
2   Bal
2   ude
2   vu
3   woo
4   boo
4   boo
 

Если вам нужно повторно использовать это для разделения других строк, которые могут быть длиннее 100 символов, вам придется добавить OPTION (MAXRECURSION 0) в запрос.