SQL函数:在MSSQL Server 2014中修改字符串和返回

时间:2018-06-04 10:42:04

标签: sql sql-server function sql-server-2014

我是SQL函数的新手,我有字符串@string =“233,344,555”。 如何修改我的字符串并将其作为“a_233,b_344,c_555”返回?

在我的函数中,我必须用“,”字符拆分字符串。 在第一个数字中,我必须在第二个数字中添加a_firstnumber 我必须添加c_secondnumber并继续使用第三个数字,依此类推。

接下来,在我的函数中,我必须将它作为字符串返回。 比如“a_233,b_344,c_555”。

如何在MSSQL函数中执行此操作?

4 个答案:

答案 0 :(得分:2)

另一种简单的方法是

DECLARE @string VARCHAR(MAX)= '233, 344, 555', @STRING2 VARCHAR(MAX)='';

SELECT @STRING = '<M>'+REPLACE(@STRING,', ','</M><M>')+'</M>';

SELECT @STRING2 = @STRING2+',' +NEW FROM (
SELECT char( row_number() over(order by(select 1))+64)+'_'+
SPLT.X.value('.','varchar(10)')  AS NEW
FROM(
SELECT CAST(@STRING AS XML) SXML
)A 
CROSS APPLY 
  SXML.nodes('/M') as SPLT(X)
)BB

SELECT SUBSTRING(@STRING2,2,LEN(@STRING2))

<强>结果:

 A_233,B_344,C_555

答案 1 :(得分:0)

您可以使用value结构并执行JOIN

select concat(t.chars, '_', t1.function_out) as numbers
from ( values (1, 'a'), (2, 'b'), (3, 'c') . . . ) t(id, chars) inner join 
           (select row_number() over (order by (select 1)) as id, 
                   function_out 
            from <your split function here>(@string, ',')
           ) t1 on t1.id = t.id;

答案 2 :(得分:0)

DECLARE @string NVARCHAR(MAX) = '233, 344, 555';

DECLARE @tParts TABLE (
    id INT IDENTITY (1, 1),
    part NVARCHAR(10)
);

-- Split your String with a Split-Function like

--INSERT INTO @tParts
--SELECT item 
--FROM dbo.Split(@string, ',');

-- Or use Demo-Values
INSERT INTO @tParts 
VALUES (N'1'), (N'2'), (N'3') -- ...

DECLARE @tPrefixes TABLE (
    id INT IDENTITY (1, 1),
    prefix NVARCHAR(10)
);

INSERT INTO @tPrefixes 
VALUES (N'a'), (N'b'), (N'c') -- ...

DECLARE @output NVARCHAR(MAX) = N'';

SELECT @output += pr.prefix + N'_' + ps.part + N', '
FROM @tPrefixes AS pr
    INNER JOIN @tParts AS ps
        ON ps.id = pr.id;

-- Remove last N', '
SET @output = LEFT(@output, LEN(@output)-1);

SELECT @output AS [output];

答案 3 :(得分:0)

使用XML更改行和返回:

alter function dbo.ModifyString(@input Varchar(max), @Splitter VarChar(99)) returns nvarchar(max)
as
begin
declare @str as nvarchar(max)
;with cte as ( SELECT  ltrim(Split.a.value('.', 'VARCHAR(max)')) AS Data 
    FROM
    ( SELECT CAST ('<M>' + REPLACE(@input, @Splitter, '</M><M>') + '</M>' AS XML) AS Data 
    ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a))
 select @str = stuff((
        select ', ' + char(row_number() over (order by [data]) + 96) + '_' + [Data]
        from cte x
        order by x.Data
        for xml path('')
    ),1,2,'') 
from cte x;
return @str
end

declare @string as nvarchar(max) = '233, 344, 555'

select dbo.ModifyString(@string, ',' )