Sql-Server

使用 STUFF 函式在字元串中的多個點插入?

  • April 10, 2018

有沒有一種方法可以替換 SQL Server 中的子字元串,同時保持“了解”我要替換的內容,以便我可以重新插入該內容?

我正在建構一串列名以進行透視,並且這些列名需要在查詢中聚合。

例如,我將此列列表作為 nvarchar(max) 字元串:

[A], [B], [C]

我想將此字元串轉換為如下所示:

sum([A]) [A], sum([B]) [B], sum([C]) [C], 

我剛剛找到了這個stuff功能,但我還不知道如何實現我想要的。

但我覺得我可以使用它來插入子字元串,而不是使用替換子字元串。

查看 stuff 功能:

STUFF( source_string, start, length, add_string )

如何一次插入多個位置?

我目前的解決方案是這樣的:

declare @cols nvarchar(max);
declare @colsAggregate nvarchar(max);
declare @sql nvarchar(max);

select @cols = stuff((
   select distinct ',' + quotename(sCode)
   from EntityList EL
   where EL.bActive = 1 for xml path(''), type).value('.', 'nvarchar(max)'),
1, 1, '');

select @colsAggregate = stuff((
   select distinct ', max(' + quotename(sCode) + ') ' + quotename(sCode)
   from EntityList EL
   where EL.bActive = 1 for xml path(''), type).value('.', 'nvarchar(max)'),
1, 1, '');

您需要先將其作為行獲取,然後才能使用 STUFF。

DECLARE @rows nvarchar(max) = '[A],[B],[C]';
DECLARE @cols nvarchar(max);

SELECT LTRIM(RTRIM(j.value)) FROM STRING_SPLIT(@rows, ',') j

SET @cols = STUFF((SELECT ', ' + (col) 
                   FROM (SELECT LTRIM(RTRIM(j.value)) col FROM STRING_SPLIT(@rows, ',') j) Foo
            FOR XML PATH(''), TYPE
            ).value('.', 'nvarchar(MAX)') 
           ,1,2,'');

SELECT @cols;

SET @cols = STUFF((SELECT ', ' + ('SUM(' + col + ')') 
                   FROM (SELECT LTRIM(RTRIM(j.value)) col FROM STRING_SPLIT(@rows, ',') j) Foo
            FOR XML PATH(''), TYPE
            ).value('.', 'nvarchar(MAX)') 
           ,1,2,'');

SELECT @cols;

SET @cols = STUFF((SELECT ', ' + ('SUM(' + col + ') ' + col) 
                   FROM (SELECT LTRIM(RTRIM(j.value)) col FROM STRING_SPLIT(@rows, ',') j) Foo
            FOR XML PATH(''), TYPE
            ).value('.', 'nvarchar(MAX)') 
           ,1,2,'');

SELECT @cols;
GO
| (無列名) |
| :--------------- |
| [一] |
| [乙] |
| [C] |

| (無列名) |
| :--------------- |
| [A]、[B]、[C] |

| (無列名) |
| :--------------------------- |
| 我是([A]),我是([B]),我是([C]) |

| (無列名) |
| :--------------------------------------- |
| SUM([A]) [A], SUM([B]) [B], SUM([C]) [C] |

dbfiddle在這裡

引用自:https://dba.stackexchange.com/questions/193411