2016-02-05 89 views
0

的发生我有一个SQL字符串参数@branchNumber = '12,23,45'现有的SQL字符串添加额外内容上逗号

我要寻找一个查询,将采取我的@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

感谢

编辑:

我有一个热膨胀系数是没有类似的东西,但是从另一个表获得分支数。我无法找到一种方法来实现它的情况下字符串。

的热膨胀系数如下:

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 
+0

你能送的表参数,而不是一个逗号分隔的字符串的?逗号分隔的字符串是数据库引擎的魔鬼...... –

+0

不幸的是不是。这是接受参数的非常大的SP的一部分,branchNumber就是其中之一。 – aMazing

回答

2

理想这种东西应该在表示层来完成,或者通过传递表参数的过程,但你已经表示这必须是在数据库引擎中完成。

如果您可以使用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]

+0

谢谢,我一上班就试试tmw。 – aMazing

+0

这工作的人..非常感谢。星系中增加了几颗星星。 – aMazing

+1

@aMazing当然,让我知道如果有什么需要解释。 –