#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)
в запрос.