Sql-Server
使用 STUFF 函式在字元串中的多個點插入?
有沒有一種方法可以替換 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在這裡