gpt4 book ai didi

mysql - 在出现逗号时向现有 SQL 字符串添加附加内容

转载 作者:行者123 更新时间:2023-11-29 07:23:45 26 4
gpt4 key购买 nike

我有一个sql字符串参数@branchNumber = '12,23,45'

我正在寻找一个查询,它将接受我的 @branchNumber参数作为输入并返回一个格式化结果,如下所示:

[Branch].[Branch Number].&[12], [Branch].[Branch Number].&[23], [Branch].[Branch Number].&[45]

所以基本上为每个分支添加 [Branch].[Branch Number].&[<branchNumber>],

我尝试使用如下子字符串:

ALTER FUNCTION AR_BI_SplitBranchesString
(
@Input NVARCHAR(MAX),
@Character CHAR(1)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @StartIndex INT, @EndIndex INT, @result NVARCHAR(MAX)

SET @StartIndex = 1
--IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
--BEGIN
-- SET @Input = @Input + @Character
--END

WHILE CHARINDEX(@Character, @Input) > 0
BEGIN
SET @EndIndex = CHARINDEX(@Character, @Input)

SET @result = '[Branch].[Branch Number].&[' + (SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)) + '],'

SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))

END

RETURN @result
END
GO

但是对于 SELECT dbo.AR_BI_SplitBranchesString('12,54', ',')返回的结果是

[Branch].[Branch Number].&[12],

仅返回第一个分支。我有它是因为 SET @Input 再次被修改。但任何帮助将不胜感激。我正在使用 SQL Server 2014。

谢谢

编辑:

我有一个 CTE 做了类似的事情,但从另一个表获取分支号。我找不到在字符串的情况下实现它的方法。

cte如下:

    ALTER FUNCTION [dbo].[AR_Fn_BI_GetOperatorBranchList]
(
-- Add the parameters for the function here
@operatorId varchar(20),
@applicationName varchar(100)
)
RETURNS varchar(max)
AS
BEGIN
declare @branchList as varchar(max)

;WITH cte (FId, branchNumbers) AS
(
SELECT 1, CAST('' AS NVARCHAR(MAX))
UNION ALL
SELECT B.FId + 1, B.branchNumbers + '[Branch].[Branch Number].&[' + cast(A.branchNumber as varchar) + '],'
FROM
(
SELECT Row_Number() OVER (ORDER BY Id) AS RN, cast(branchNumber as varchar(8)) as branchNumber
FROM <AnotherTable>
where OperatorId = @operatorId
and [Application] = @applicationName) A
INNER JOIN cte B ON A.RN = B.FId
)

SELECT top 1 @branchList = '{' + subString(branchNumbers, 1, len(branchNumbers) - 1)+ '}'
FROM cte
ORDER BY FId DESC
option (maxrecursion 0)
-- Return the result of the function

RETURN @branchList
END

最佳答案

理想情况下,这种事情应该在表示层中完成,或者通过将表参数传递给过程来完成,但您已经表明这必须在数据库引擎中完成。

如果您可以使用 CLR,那可能是更好的选择。您可以使用 String.Split 在一行中完成此操作,它接受单个输入并返回单个输出。它可能会比一堆 CHARINDEX/SUBSTRING 调用执行得更好,您甚至可以将其标记为确定性。

如果您确实必须在 TSQL 中执行此操作,我将使用 CHARINDEXstart_location 参数而不是重复获取新子字符串并更新 @Input。类似于以下内容:

ALTER FUNCTION AR_BI_SplitBranchesString
(
@Input NVARCHAR(MAX),
@Character CHAR(1)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
IF @Input IS NULL RETURN NULL

DECLARE @StartIndex INT = 1, @result NVARCHAR(MAX) = ''
DECLARE @EndIndex INT = CHARINDEX(@Character, @Input, @StartIndex)

WHILE @EndIndex > 0
BEGIN
IF @result <> ''
SET @result += ', '

SET @result += '[Branch].[Branch Number].&[' +
SUBSTRING(@Input, @StartIndex, @EndIndex - @StartIndex) + ']'

SET @StartIndex = @EndIndex + 1
SET @EndIndex = CHARINDEX(@Character, @Input, @StartIndex)
END

--CHARINDEX returned -1 so we're done but we need to append the rest
IF @result <> ''
SET @result += ', '

SET @result += '[Branch].[Branch Number].&[' +
SUBSTRING(@Input, @StartIndex, LEN(@Input)) + ']'

RETURN @result
END
GO

[SQL Fiddle Demo ]

关于mysql - 在出现逗号时向现有 SQL 字符串添加附加内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35215481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com