2016-02-05 61 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當然,讓我知道如果有什麼需要解釋。 –

相關問題