Sql-Server-2014

如何使用 string_split - ms sql server 傳遞列名?

  • December 29, 2018

我正在嘗試使用字元串拆分來傳遞列名,因為我需要該表中的值才能與另一個表連接。

我已經在 Postgresql 中實現了這一點,我從這些列中獲取了值:

  SELECT unnest(array["column_name1","column_name2","column_name3" AS "amount"
  FROM table1

unnest 與列名周圍的引號相結合,為每個值返回一個數組到一組行。

Amount
307579.00
25579.00
212871.00

現在我想在 MS Server 中做同樣的事情:

  DECLARE @amount NVARCHAR(50) = 'column_name1/column_name2/column_name3'
  SELECT "value" from string_split(@amount,'/')

但這只會給我文字字元串:

Amount
column_name1
column_name2
column_name3

我一直在嘗試和搜尋如何傳遞一個 elemant,它將讀取為列名並像第一個範例一樣在一個列中顯示值,也許我不應該使用字元串拆分器等。有點卡在這個..

您需要通過建構一個全新的 SELECT 查詢來使用動態 SQL 來實現您的邏輯。

例如:

DECLARE @CMD nvarchar(max), @amount NVARCHAR(50) = 'column_name1/column_name2/column_name3'
SELECT @CMD = ISNULL(@CMD + ', ', N'SELECT ') + QUOTENAME([value])
FROM STRING_SPLIT(@amount,'/')
SET @CMD = @CMD + N' FROM table1'
PRINT @CMD
EXEC(@CMD)

它的輸出將是:

SELECT [column_name1], [column_name2], [column_name3] FROM table1

為了獲取單個列下的所有值,您需要“取消透視”數據。有兩種主要方法可以做到這一點。一種是通過標準的 UNPIVOT 命令,如下所示:

DECLARE @CMD nvarchar(max), @amount NVARCHAR(50) = 'column_name1/column_name2/column_name3'
SELECT @CMD = ISNULL(@CMD + ', ', N'SELECT unpvt.* FROM table1 UNPIVOT (amount FOR amounttype IN ( ') + QUOTENAME([value])
FROM STRING_SPLIT(@amount,'/')
SET @CMD = @CMD + N' ) AS unpvt'
PRINT @CMD
EXEC(@CMD)

它的輸出將是:

SELECT unpvt.* FROM table1 UNPIVOT (amount FOR amounttype IN ( [column_name1], [column_name2], [column_name3]) AS unpvt

另一種方法是將 CROSS APPLY 與 Values 建構子一起使用,如下所示:

DECLARE @CMD nvarchar(max), @amount NVARCHAR(50) = 'column_name1/column_name2/column_name3'
SELECT @CMD = ISNULL(@CMD + '), (', N'SELECT v.amount FROM table1 CROSS APPLY(VALUES(') + QUOTENAME([value])
FROM STRING_SPLIT(@amount,'/')
SET @CMD = @CMD + N')) AS v(amount)'
PRINT @CMD
EXEC(@CMD)

它的輸出將是:

SELECT v.amount FROM table1 CROSS APPLY(VALUES([column_name1]), ([column_name2]), ([column_name3])) AS v(amount)

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