Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在字符串之间插入逗号_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql 如何在字符串之间插入逗号

Sql 如何在字符串之间插入逗号,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一个字符串,我需要在给定字符串之间插入一个逗号。请帮我提一些想法 declare @a varchar(15) = 'asdfghj' select @a 我希望输出为“a,s,d,f,g,h,j”我非常同意Panagiotis Kanavos的评论。下面的代码片段将适用于您 Declare @a varchar(15) = 'asdfghj',@OUTPUT VARCHAR(MAX)= '' SELECT @OUTPUT = @OUTPUT+AA+',' FROM ( SELECT n

我有一个字符串,我需要在给定字符串之间插入一个逗号。请帮我提一些想法

declare @a varchar(15) = 'asdfghj'
select @a

我希望输出为“a,s,d,f,g,h,j”

我非常同意Panagiotis Kanavos的评论。下面的代码片段将适用于您

Declare @a varchar(15) = 'asdfghj',@OUTPUT VARCHAR(MAX)= ''

SELECT @OUTPUT = @OUTPUT+AA+',' FROM (
SELECT number ,SUBSTRING(@a, number, 1) AA
FROM master.DBO.spt_values WHERE TYPE = 'P'
AND number BETWEEN 1 AND LEN(@a)
)A
Order by number

SELECT SUBSTRING(@OUTPUT,1,LEN(@OUTPUT)-1)

我使用了微软没有记录的spt_值,这是不可取的。您可以用数字表来代替

SQL Server并不是设计来实现这一点的,但这里有一个简单的方法可以在while循环中实现这一点

    DECLARE @a varchar(15) = 'asdfghj'
    DECLARE @i int = 1
    DECLARE @output varchar(30)

    WHILE (@i <= len(@a))
    BEGIN
        SET @output = ISNULL(@output,'') + ',' + SUBSTRING(@a, @i, 1)
        SET @i = @i + 1
    END

    SET @output = STUFF(@output,1,1,'')

    SELECT @output
输出:a、s、d、f、g、h、j

它接受输入的每个单独字符,并在其前面插入逗号。STUFF函数删除字符串中的第一个逗号,如果愿意,可以使用子字符串或右键执行此操作


如果您调整@a和@output的长度,这将适用于您传入的任何长度字符串,请仔细考虑Panagiotis Kanavos的评论,但如果您希望使用T-SQL实现这一点,一种可能的方法是使用递归CTE和SQL Server 2008支持的XML:

DECLARE @a varchar(15) = 'asdfghj'

;WITH cte AS (
    SELECT SUBSTRING(@a, 1, 1) AS Symbol, 1 AS Position
    UNION ALL
    SELECT SUBSTRING(@a, Position + 1, 1), Position + 1
    FROM cte
    WHERE Position < LEN(@a)
)
SELECT STUFF((
    SELECT CONCAT(N',',  Symbol)
    FROM cte
    ORDER BY Position
    FOR XML PATH('')
), 1, 1, N'') AS Result
OPTION (MAXRECURSION 0)
注: 仅供参考,从SQL Server 2017开始,您可以使用:


试试这个简单的方法

声明@INPUT VARCHAR10='ABCD' 声明@i INT=1 声明@OUTPUT VARCHAR50= 而@I<=LEN@INPUT 开始 设置@OUTPUT=@OUTPUT+SUBSTRING@INPUT,@i,1+,' 设置@i=@i+1 终止 设置@OUTPUT=SUBSTRING@OUTPUT1.LEN@OUTPUT - 1 打印@输出
这将在SQLServer2008中起作用

DECLARE @a varchar(max)='23'
DECLARE @b INT=len(@a)

WHILE @b>1
SELECT @a=stuff(@a,@b,0,','),@b-=1

SELECT @a
如果您升级到sql server 2017,则可以使用此版本,前提是字符串长度不超过2047个字符2047是spt_值中type=p的最大数字,否则可以使用数字表或类似工具:

DECLARE @a varchar(max)='abcd'

SELECT string_agg(substring(@a,number+1,1),',')
FROM master..spt_values
WHERE number < len(@a)
and type='P'
正如已经提到的,这是一个可怕的想法。 如果可以避免,请不要在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;

希望这能起作用,我用STUFF函数插入


首先不要在SQL中这样做。SQL语言在字符串操作方面非常差。你为什么要这么做?你想做什么?这根绳子是从哪里来的?也许有更好的方法来做你想做的事情,而不涉及字符串操作递归cte?下面的答案可能会对你有所帮助,但无论你使用什么,它都会大大降低你的查询速度。我想很多人都有这个问题。我不同意关闭的建议,也不同意所有的否决票。我本希望这会包含在sql server 2016的字符串分割中。复制其他人的答案并重新发布(只做很小的更改)通常被认为是不好的形式。亲爱的@Rich Benner。这是我自己的代码。我没有抄袭兄弟。你可以用“不告诉任何人”的方法稍微改进你的答案
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;
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,[,],;,#,?,|           |
+---------------------------------------------------------------------------+
    declare @a varchar(15) = 'asdfghj'
    declare @totalchar int = len(@a)
    declare @counter int = @totalchar

    while @counter >=1
    begin 
            if @counter + 1 <= @totalchar
            begin
                 set @a = stuff(@a,@counter + 1, 0 , ',')
            end
            set @counter = @counter -1
    end

    select @a