存储过程返回的是行数而不是列值
我从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输出:
的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结果中的最后一行数。
那么如何访问实际的查询结果而不是数据的大小呢?
没有冒犯性,但似乎你正在增加一层不需要存在的复杂性。本部分:
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的处理是或者返回一个层:
- 动态SQL
- 在tempdb临时存储(#或##桌)
除非你有严格的规则,我只想做你的回报率数据与
GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID, @runDate
换行波科对象的列表,如果你使用的是实体框架或ADO.NET,如果一个DataTable。
那么我们正在使用临时表,因为我们需要一次隔离一列。 'uspGetEventKillSheetDetailedReport'有5-6列,我们不需要,所以我们的计划是为我们需要的列查询'uspGetEventKillSheetDetailedReport',将它存储到临时表中,然后查询临时表,因为我们不能查询存储过程。 –
您可以将数据保留在内存中以便稍后查询,或者如果您要在市场分析后进行操作,则可以使用永久表。我不会将数据存储在您将要返回的tempdb中。它通常用于临时存储,因此是名称。如果你真的想做一个临时对象的返回,但是稍后想要查询这个对象,为什么不创建一个永久表并将其标记为'stagingKillSheetDetailedReport'?您将在分析tempdb对象时遇到麻烦。这是通常为SQL Server保留的级别,而不是.NET访问级别。 – djangojazz
我想使用temp,因为如果我们使用永久数据库,每次有人运行程序时,它都会生成261个更多的条目(并且我正在为3个查询执行此操作),所以它会在内存中变得非常激烈。我们找到了一种方法来实现它,而不是使用'from d in ......选择新的{d.capacity}'。我将很快发布一个答案 –
我能够通过从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]);
}
存储过程返回是行数,而不是结果集。这里有什么'db'?这个实体框架? – DavidG
正确,我如何获得结果集?它应该按照预期的方式工作,用“从...选择”,不是吗? –
您需要在存储过程的顶部设置“set nocount on”吗? – DaveShaw