如果您不能使用存儲過程,你需要使用的功能,你可以UNPIVOT
數據和比client side
可以PIVOT
它。
當不同數量的列返回到SQL Server Reporting Services
報告時,我需要做這樣的事情。例如,下面的代碼總是返回三列 - RowID
,Column
,Value
:
DECLARE @Table01 TABLE
(
[ID] INT
,[Value01] INT
,[Value02] NVARCHAR(256)
,[Value03] SMALLINT
);
DECLARE @Table02 TABLE
(
[ID] INT
,[Value01] INT
);
INSERT INTO @Table01 ([ID], [Value01], [Value02], [Value03])
VALUES (1, 111, '1V2', 7)
,(2, 222, '2V2', 8)
,(3, 333, '3V2', 9);
INSERT INTO @Table02 ([ID], [Value01])
VALUES (1, 111)
,(2, 222)
,(3, 333);
-- your function starts here
DECLARE @Mode SYSNAME = 'Table01' -- try with 'Table02', too
DECLARE @ResultSet TABLE
(
[RowID] INT
,[Column] SYSNAME
,[Value] NVARCHAR(128)
);
IF @Mode = 'Table01'
BEGIN;
INSERT INTO @ResultSet ([RowID], [Column], [Value])
SELECT [ID]
,[Column]
,[Value]
FROM
(
SELECT [ID]
,CAST([Value01] AS NVARCHAR(256))
,CAST([Value02] AS NVARCHAR(256))
,CAST([Value03] AS NVARCHAR(256))
FROM @Table01
) DS ([ID], [Value01], [Value02], [Value03])
UNPIVOT
(
[Value] FOR [Column] IN ([Value01], [Value02], [Value03])
) UNPVT
END;
ELSE
BEGIN;
INSERT INTO @ResultSet ([RowID], [Column], [Value])
SELECT [ID]
,[Column]
,[Value]
FROM
(
SELECT [ID]
,CAST([Value01] AS NVARCHAR(256))
FROM @Table02
) DS ([ID], [Value01])
UNPIVOT
(
[Value] FOR [Column] IN ([Value01])
) UNPVT
END;
SELECT *
FROM @ResultSet;
然後在我需要再次執行pivot
運行報告。這是解決方法有很多侷限性:
- 的
unpivot
數據必須被強制轉換成其最大的類型(通常爲字符串)進行
- 不必要的操作(
pivot
- >unpivot
),而不是僅僅渲染數據;
- 並不大數據量的運作良好(它是緩慢的)
等..
還不如一個用戶定義的函數,但是你可以從它創建一個存儲過程有一點問題都沒有。 –
試一試'創建PROC proc_name中(@Reporttype CHAR(1)) 作爲 開始 如果@Reporttype = '1' 選擇lcustomerid,LNAME,從客戶 FNAME 凡dtcreated> @startdate 否則,如果@Reporttype = '2' 選擇條碼,LNAME,FNAME 從員工那裏 dtcreated> @startdate 否則,如果@reporttype = '3' 選擇thetime,LNAME,名稱,條形碼,lcustomerid 從客戶那裏 dtcreated> @startdate 結束' –
我想你應該有3個不同的函數或者存儲過程,並控制從你的代碼執行哪一個函數,你將需要不同的方式來處理基於reporttype返回的數據。 –