2017-07-17 76 views
0

我從ASP.NET調用存儲過程來獲取數據以存儲在數組中。問題是,爲了返回我需要的值,我首先必須調用另一個存儲過程並將結果轉儲到臨時表中。這會在SQL端生成正確的記錄,但是當我在ASP中調用它時,它將最後一條記錄的索引作爲int返回。因此,即使SQL生成正確的結果,ASP在調用存儲過程時也無法訪問它們。存儲過程返回的是行數而不是列值

下面是我如何我的SQL設置:

IF OBJECT_ID('#temp') IS NOT NULL 
    BEGIN 
     DROP TABLE #temp 
    END 

CREATE TABLE #temp 
(
EventID nvarchar(50), 
RunDate date, 
SectionCode nvarchar(50), 
SectionMapCode nvarchar(50), 
DispSort int, 
Capacity nvarchar(50), 
Attendance int, 
PctCap int, 
HeatColor nvarchar(50) 
) 

DECLARE @runDate date = GETDATE() 
--Insert results from killsheet sproc into temp table 
INSERT #temp Exec GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID, @runDate; 

select Capacity from #temp; 

的SQL輸出:

enter image description here

的ASP電話:

string option = TempData["option"].ToString(); 
var secCapacity = db.uspGetSecCapacityNew(option); 
ViewData["Capacity"] = secCapacity; 
System.Diagnostics.Debug.WriteLine("capacity " + secCapacity); 

而ASP輸出:

capacity 261

請注意secCapacity等於261,這是SQL結果中的最後一行數。

那麼如何訪問實際的查詢結果而不是數據的大小呢?

+0

存儲過程返回是行數,而不是結果集。這裏有什麼'db'?這個實體框架? – DavidG

+0

正確,我如何獲得結果集?它應該按照預期的方式工作,用「從...選擇」,不是嗎? –

+3

您需要在存儲過程的頂部設置「set nocount on」嗎? – DaveShaw

回答

0

沒有冒犯性,但似乎你正在增加一層不需要存在的複雜性。本部分:

DECLARE @runDate date = GETDATE() 
--Insert results from killsheet sproc into temp table 
INSERT #temp Exec GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID, @runDate; 

select Capacity from #temp; 

您正在使用一個proc插入SQL Server中的臨時對象。爲什麼不只是返回這個依賴過程?這是一個非常內存密集的內存操作或需要臨時存儲的東西嗎?如果沒有,我只會得到結果集。使用返回結果集合來存儲臨時存儲可能會有問題。尤其是當你處理.NET的處理是或者返回一個層:

  1. 動態SQL
  2. 在tempdb臨時存儲(#或##桌)

除非你有嚴格的規則,我只想做你的回報率數據與

GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID, @runDate 

換行波科對象的列表,如果你使用的是實體框架或ADO.NET,如果一個DataTable。

+0

那麼我們正在使用臨時表,因爲我們需要一次隔離一列。 'uspGetEventKillSheetDetailedReport'有5-6列,我們不需要,所以我們的計劃是爲我們需要的列查詢'uspGetEventKillSheetDetailedReport',將它存儲到臨時表中,然後查詢臨時表,因爲我們不能查詢存儲過程。 –

+0

您可以將數據保留在內存中以便稍後查詢,或者如果您要在市場分析後進行操作,則可以使用永久表。我不會將數據存儲在您將要返回的tempdb中。它通常用於臨時存儲,因此是名稱。如果你真的想做一個臨時對象的返回,但是稍後想要查詢這個對象,爲什麼不創建一個永久表並將其標記爲'stagingKillSheetDetailedReport'?您將在分析tempdb對象時遇到麻煩。這是通常爲SQL Server保留的級別,而不是.NET訪問級別。 – djangojazz

+0

我想使用temp,因爲如果我們使用永久數據庫,每次有人運行程序時,它都會生成261個更多的條目(並且我正在爲3個查詢執行此操作),所以它會在內存中變得非常激烈。我們找到了一種方法來實現它,而不是使用'from d in ......選擇新的{d.capacity}'。我將很快發佈一個答案 –

0

我能夠通過從ASP中分離我的存儲過程而不是試圖從SQL導入特定數據來解決它。

var uspCapacity = from d in db.uspGetEventKillSheetDetailedReport(option, date) 
         select new 
         { 
          d.Capacity 
         }; 
    var uspAttendance = from d in db.uspGetEventKillSheetDetailedReport(option, date) 
         select new 
         { 
          d.Attendance 
         }; 
    var uspSectionMapCode = from d in db.uspGetEventKillSheetDetailedReport(option, date) 
         select new 
         { 
          d.SectionMapCode 
         }; 

    var uspCapacityList = uspCapacity.ToArray(); 
    var uspAttendanceList = uspAttendance.ToArray(); 
    var uspSectionMapCodeList = uspSectionMapCode.ToArray(); 

我測試通過使用:

for (var i = 0; i < 3; i++) 
    { 
     System.Diagnostics.Debug.WriteLine("Capacity " + uspCapacityList[i] + " Attendance " + uspAttendanceList[i] + " Section Map Code " + uspSectionMapCodeList[i]); 
    }