在開發SQL Server語序中,可能需要這樣一個要求,把表中某一列的所有值轉換為使用逗號分隔的字元串去呈現出來。 舉個例子: IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL BEGIN DROP TABLE #tempTable END CREATE ...
在開發SQL Server語序中,可能需要這樣一個要求,把表中某一列的所有值轉換為使用逗號分隔的字元串去呈現出來。
舉個例子:
IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL BEGIN DROP TABLE #tempTable END CREATE TABLE #tempTable ([ID] INT NOT NULL,[Category] NVARCHAR(40) NULL) INSERT INTO #tempTable ([ID],[Category]) VALUES (1,'Table'), (2,'View'), (3,'Store Procedure'), (4,'Table-valued Function'), (5,'Scalar-valued Function'), (6,'User-Defined Table Type') SELECT [ID],[Category] FROM #tempTable GOSource Code
要求結果,[ID]或[Category]任意一列,呈現如下:
日後,我們不清楚是哪一張表,哪一個欄位。
因此,可以寫成一個動態的SQL 存儲過程來處理:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Insus.NET -- Create date: 2019-05-11 -- Update date: 2019-05-11 -- Description: 列值轉換為逗號分隔字元串 -- ============================================= CREATE PROCEDURE [dbo].[usp_TableColumnValueToCommaDelimitedString] ( @tableName SYSNAME, @columnName SYSNAME, @ReturnValue NVARCHAR(MAX) OUTPUT ) AS BEGIN DECLARE @sql NVARCHAR(MAX) = N' DECLARE @temporary_table AS TABLE([multirow_comma-delimited_string] NVARCHAR(MAX)) INSERT INTO @temporary_table ([multirow_comma-delimited_string]) SELECT TOP(1) STUFF( REPLACE( RTRIM( (SELECT ''|'' + CAST('+ @columnName +' AS NVARCHAR(MAX)) FROM '+ @tableName +' FOR XML PATH('''') ) ), ''|'','', ''), 1,1,'''') FROM '+ @tableName +' SELECT @ReturnValue = [multirow_comma-delimited_string] FROM @temporary_table' EXECUTE sp_executesql @sql, N'@ReturnValue NVARCHAR(MAX) OUTPUT', @ReturnValue OUTPUT ENDSource Code
只要為上面存儲過程傳入表名,欄位名等參數即可得到我們想要的結果: