Как уже упоминалось, это ужасная идея.
Не делайте этого в SQL Server, если вы можете избежать этого.
Тем не менее, если по какой-то причине вы не можете избежать этого, решение на основе множеств для этого будет включать таблицу чисел. Если у вас нет одного из них, вы можете сгенерировать его с небольшими накладными расходами, используя cte
. Для работы только с одним значением вы можете сделать это:
declare @a varchar(15) = 'asdfghj';
with t(t)as(select t from(values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))as t(t))
,n(n)as(select top(len(@a)) row_number()over(order by(select null)) from t,t t2,t t3,t t4)
select @a = stuff((select ',' + substring(@a,n,1)
from n
order by n
for xml path('')
)
,1,1,''
);
select @a;
Какие выходы: a,s,d,f,g,h,j
Или, чтобы применить эту логику к таблице значений, вы можете сделать следующее:
declare @t table (a varchar(100));
insert into @t values('asdfghj'),('qwerty'),('qwertyuiopasdfghjklzxcvbnm[];#?|');
with t(t)as(select t from(values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))as t(t))
,n(n)as(select top(select max(len(a)) from @t) row_number()over(order by(select null)) from t,t t2,t t3,t t4)
select stuff((select ',' + substring(a,n,1)
from n
where n.n <= len(t.a)
order by n.n
for xml path('')
)
,1,1,''
) as CommaDelimited
from @t as t;
Какие выходы:
+---------------------------------------------------------------------------+
| CommaDelimited |
+---------------------------------------------------------------------------+
| a,s,d,f,g,h,j |
| q,w,e,r,t,y |
| q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m,[,],;,#,?,| |
+---------------------------------------------------------------------------+