2016-11-30 41 views
0

我處於將Crystal報表轉換爲SSRS(Sql Server Reporting Services)的情況。SSRS:使用返回具有相同名稱的列的存儲過程報告服務

原始報告提供了存儲過程的結果,該存儲過程返回具有相同確切名稱的列。

這怎麼可能?我向你解釋:

上一位程序員做了一些可怕的黑客攻擊。它將選擇結果放入#TempTable中。

我們假設選擇塞住#TempTable確實

SELECT a,b,c INTO #TempTable FROM mytable 

然後在這個存儲過程結束時返回什麼:

SELECT aliasTemp.*, a, b, c from #TempTable aliasTemp 

返回的結果是

a,b,c,a,b,c

這在SQL方面是可怕的,但我不能c更改數據庫,因爲我的客戶不希望對生產環境進行任何更改。

當我嘗試爲數據源添加此存儲過程的報告中,我得到這個:

Error

這是一個自我解釋錯誤,說,雖然報告服務嘗試檢索字段的存儲過程返回,如果發現重複的命名列,所以它不會工作。

由於報告服務,您可以使用SQL查詢或存儲過程,我因子評分可能是一個解決辦法是這樣的查詢直接進入報表作爲SQL SELECT

CREATE TABLE #tmpBus 
(
    a INT, 
    b INT, 
    c INT 
) 

INSERT INTO #tempTable 
Exec StupidStoredProcedure'Params' 

避免檢索到的額外列它們具有相同的名稱並且只提取前3個。但它表示提取的列與臨時表不匹配。

我該如何做到這一點?

+0

如果你不能改變現有的存儲過程,創建一個新的(複印件),像它應該工作。轉換完成後擺脫舊的。我錯過了什麼嗎?沒有必要這麼做,或者在已經存在的地方添加另一個黑客。修理它! –

+0

由於客戶拒絕修改數據庫/服務器端代碼,因此我無法做任何更改,否則我將修復存儲過程。 –

回答

0

我自己找到了解決方案,我剛剛在臨時表中對字段進行了不同的重命名。

下面的代碼,假設StupidStoredProcedure提取這些列具有相同名稱(嘆氣:S)

A,B,C,A,B,C

IF OBJECT_ID('tempdb.dbo.#ARandomTempTable', 'U') IS NOT NULL 
    DROP TABLE #ARandomTempTable 

CREATE TABLE #ARandomTempTable (
    a NVARCHAR(255), 
    b NVARCHAR(255), 
    c NVARCHAR(255), 
    a2 NVARCHAR(255), 
    b2 NVARCHAR(255), 
    c2 NVARCHAR(255) 
) 

INSERT INTO #ARandomTempTable 
EXEC StupidStoredProcedure @StupidParam = "Hello" 

SELECT 
    a, 
    b, 
    c, 
    a2, 
    b2, 
    c2 
FROM #ARandomTempTable 

這樣,我完全獨立於存儲過程的輸出,我可以根據我的意願命名結果參數。

感謝誰試圖幫助

0

您的臨時表需要6列。當使用exec插入時,表def必須匹配:列數,數據類型,我相信可空性。

+0

我以另一種方式進行修復。我會發布解決方案。 –

+0

你的方式正是我所建議的。雖然看起來在深夜發帖我錯過了我的最後一句話,本來應該說,臨時表中的字段名稱不需要匹配:-) – SMM

+0

噢好吧,我當時不明白:P ...我把代碼如果有人發現這可能會很快解決它 –