SQL 功能:在 MSSQL Server 2014 中修改字符串和 Return
SQL Function: Modify String and Return in MSSQL Server 2014
我是 SQL 函数的新手,我有字符串 @string = "233, 344, 555"。
如何修改我的字符串并将其 return 修改为 "a_233, b_344, c_555"?
在我的函数中,我必须用“,”字符拆分字符串。
在第一个数字中,我必须在第二个数字中添加 a_firstnumber
我必须添加 c_secondnumber 并继续添加第三个数字,依此类推。
接下来,在我的函数中,我还必须 return 它作为字符串。
像 "a_233, b_344, c_555".
如何在 MSSQL 函数中实现?
您可以使用 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;
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];
另一个简单的方法是
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
使用 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, ',' )
我是 SQL 函数的新手,我有字符串 @string = "233, 344, 555"。 如何修改我的字符串并将其 return 修改为 "a_233, b_344, c_555"?
在我的函数中,我必须用“,”字符拆分字符串。 在第一个数字中,我必须在第二个数字中添加 a_firstnumber 我必须添加 c_secondnumber 并继续添加第三个数字,依此类推。
接下来,在我的函数中,我还必须 return 它作为字符串。 像 "a_233, b_344, c_555".
如何在 MSSQL 函数中实现?
您可以使用 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;
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];
另一个简单的方法是
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
使用 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, ',' )