在Insus.NET的blog里,可以找到相關的行列轉換文章。可以點擊下面鏈接 http://www.cnblogs.com/insus/archive/2011/03/05/1971446.html 慢慢看來。
不過,今天Insus.NET再詳細演示一番,望讓網友們更加理解與應用。
還是先來看看實時演示吧:
想實現行與列轉換,得先一弄清楚哪些原數據被轉為列名,哪些原數列名被轉換為行數據。就依上圖來說。原列名[Fruit Name]沒有被轉換,還是作為新表的列名,而原[Kind Name]和[ID]列名被轉換為新[Fruit Name]列的行數據了,而原[Fuit Name]所在行的數據將轉換為列名。
好,我們弄清楚,在存儲過程中,創建一個雛形的臨時表,並插入兩筆數據。
然后,我們宣告一個表變量,你也可以宣告一個臨時表也行。目的是把需要處理的數據先存入這個表變量中。這樣有處理時,不必每次去讀取原始表數據。
接下來,我們開始處理表變量的數據:
上圖的代碼示例中,
#26是找出表變量中[Fruit_nbr]最大的值。
#28至#45行是一個循環塊,只要變量@r小於等於變量@rs,它都會跑,每跑完一遍,變量@r都會在#44行中加1。
#32行代碼,是判斷表變量中是否有跳號的記錄。雖然[Fruit_nbr]的一個自動增長的字段,如果在記錄維護時,有刪除記錄的話,就會出現跳號。因此需要判斷。
#34行代碼,是把當前處理記錄的兩個值,即ID和Kind Name找出來。
#36至#38 行代碼,是修心臨時表,添加一個字段。
#40和#41是對臨時表作更新操作。
#47行代碼是SELECT臨時表所有記錄。
完整的存儲過程:

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Insus.NET -- Create date: 2013-09-04 -- Description: convert row to column. -- ============================================= CREATE PROCEDURE [dbo].[usp_Fruit_Row2Col] AS BEGIN IF OBJECT_ID('[dbo].[#DummyTable]') IS NOT NULL DROP TABLE [dbo].[#DummyTable] CREATE TABLE [dbo].[#DummyTable] ( [Fruit Name] NVARCHAR(20) ) INSERT INTO [dbo].[#DummyTable] ([Fruit Name]) VALUES ('Kind Name'),('ID') DECLARE @ft AS TABLE ([Fruit_nbr] INT,[KindName] NVARCHAR(30),[FruitName] NVARCHAR(30)) INSERT INTO @ft SELECT [Fruit_nbr],[KindName],[FruitName] FROM [dbo].[udf_Fruit]() DECLARE @r INT = 1, @rs INT = 0 SELECT @rs = MAX(ISNULL([Fruit_nbr],0)) FROM @ft WHILE @r <= @rs BEGIN DECLARE @kn NVARCHAR(30), @fn NVARCHAR(20) IF EXISTS (SELECT TOP 1 1 FROM @ft WHERE [Fruit_nbr] = @r) BEGIN SELECT @kn = [KindName], @fn = [FruitName] FROM @ft WHERE [Fruit_nbr] = @r EXECUTE('IF NOT EXISTS(SELECT [name] FROM [tempdb].[dbo].[syscolumns] WHERE [id] = OBJECT_ID(''[tempdb].[dbo].[#DummyTable]'') AND [tempdb].[dbo].[syscolumns].[name] = '''+ @fn +''') ALTER TABLE [tempdb].[dbo].[#DummyTable] ADD [' + @fn + '] NVARCHAR(100)') EXECUTE('UPDATE [dbo].[#DummyTable] SET ['+ @fn +'] = N'''+ @kn +''' WHERE [Fruit Name] = ''Kind Name''') EXECUTE('UPDATE [dbo].[#DummyTable] SET ['+ @fn +'] = '''+ @r +''' WHERE [Fruit Name] = ''ID''') END SET @r += 1 END SELECT * FROM [dbo].[#DummyTable] END