Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于多行,每行返回一个字段,并将其转换为要显示的一行值_C#_Sql Server 2008_Stored Procedures - Fatal编程技术网

C# 对于多行,每行返回一个字段,并将其转换为要显示的一行值

C# 对于多行,每行返回一个字段,并将其转换为要显示的一行值,c#,sql-server-2008,stored-procedures,C#,Sql Server 2008,Stored Procedures,寻找建议 我有一个包含项目数据的表和另一个包含项目准备级别列表的表。由于项目可能会有许多准备就绪级别,并且每个准备就绪级别可以分配给许多项目,这有可能创建多对多关系,因此我创建了一个连接表来避免这种情况 The junction table is simply: projectID (int), readinessLevelID (int), (the range of values is 1-9 for this field) readinessLevelDate (date

寻找建议

我有一个包含项目数据的表和另一个包含项目准备级别列表的表。由于项目可能会有许多准备就绪级别,并且每个准备就绪级别可以分配给许多项目,这有可能创建多对多关系,因此我创建了一个连接表来避免这种情况

The junction table is simply:
   projectID (int),
   readinessLevelID (int), (the range of values is 1-9 for this field)
   readinessLevelDate (date)
由于每个项目将有多行,我只需要返回每个readinessLevel的readinessLevelDate字段,因此我希望将这些日期附加到项目数据查询中记录的末尾,而不是为每个readinessLevel创建一行,每个项目可能有9行或更多行。根据测试和评估,每个项目可能在准备就绪级别上下浮动,因此项目可能包含多个级别的多个记录。当然,管理层希望看到的是每个级别达到的最新日期

我尝试创建一个存储过程

CREATE PROCEDURE [dbo].[return_Readiness_Level_Dates] (@Proj_ID Int)
--ALTER  Proc [dbo].[return_Readiness_Level_Dates] (@Proj_ID Int)
As

Declare  @readDate Date

Select   @readDate = max(readinessLevelDate)
From     projectReadinessLevel
Where    projectID = @Proj_ID AND readinessLevelID = 1

return @readDate ;
这将返回错误消息206,级别16,状态2,过程返回\u TRL\u级别\u日期,第19行[批处理开始行7] 操作数类型冲突:日期与int不兼容

第一个问题是,如何告诉SP我要返回日期值?显然,它试图返回一个int

如果没有返回值@readDate,SP将运行并返回0整数

下一个问题是,SP是否会返回可以附加到记录集并显示的数据行

最初的想法是创建一个输出变量,该变量将包含实现的每个就绪级别的日期,但是,我找不到如何在C中将该日期传递回调用过程的示例

任何帮助都将不胜感激

谢谢,
Bob

您当前的语法更像是标量

在程序中,返回@readDate;正在导致错误。在过程中,您不会返回这样的值,但可以返回整数状态码

要从返回数据,可以通过选择返回行集,也可以使用输出参数

e、 g

可简化为:

CREATE PROCEDURE [dbo].[return_Readiness_Level_Dates] (@Proj_ID Int)
--ALTER  Proc [dbo].[return_Readiness_Level_Dates] (@Proj_ID Int)
As
begin;
Select   readDate = max(readinessLevelDate) 
From     projectReadinessLevel
Where    projectID = @Proj_ID AND readinessLevelID = 1
end;
如果要在一行中返回9个readinessLevelDate,可以使用如下条件聚合:

create procedure dbo.return_readiness_level_dates (@Proj_ID int) as 
begin;
set nocount on;
select 
    ProjectId 
  , Level_1_Ready_Date = max(case when readinessLevelId = 1 then readinessLevelDate end)
  , Level_2_Ready_Date = max(case when readinessLevelId = 2 then readinessLevelDate end)
  , Level_3_Ready_Date = max(case when readinessLevelId = 3 then readinessLevelDate end)
  , Level_4_Ready_Date = max(case when readinessLevelId = 4 then readinessLevelDate end)
  , Level_5_Ready_Date = max(case when readinessLevelId = 5 then readinessLevelDate end)
  , Level_6_Ready_Date = max(case when readinessLevelId = 6 then readinessLevelDate end)
  , Level_7_Ready_Date = max(case when readinessLevelId = 7 then readinessLevelDate end)
  , Level_8_Ready_Date = max(case when readinessLevelId = 8 then readinessLevelDate end)
  , Level_9_Ready_Date = max(case when readinessLevelId = 9 then readinessLevelDate end)
from ProjectReadinessLevel
where ProjectId = @Proj_ID
group by ProjectId;
end;
go

谢谢,这适用于一个准备级别。现在,正如我在最初的帖子中提到的,每个项目将有多达9个准备就绪级别的日期,需要使用C代码返回和显示这些日期。1如果我接受您的建议并创建一个标量函数,那么当每个select语句只返回一个日期时,如何为输出记录集分配多个变量?2或者,我是否只需要调用函数9次,以传递预期的就绪级别?3或者,我可以使用return var1、var2…返回多个输出变量吗?@RLoomas我可以使用条件聚合或pivot返回一行,其中包含给定ProjectId的所有9个日期。答案更新了一个例子你能提供一个例子或一个链接到一篇有例子的帖子吗?@RLoomas我在我的答案底部添加了一个例子,这是一个rextester演示:很抱歉这里停顿太久,我被转移到了另一个问题上。我喜欢条件聚合,它正是我想要的。我甚至能够使用该功能创建一个视图,这使我们的程序员更容易从表单调用。。。
create procedure dbo.return_readiness_level_dates (@Proj_ID int) as 
begin;
set nocount on;
select 
    ProjectId 
  , Level_1_Ready_Date = max(case when readinessLevelId = 1 then readinessLevelDate end)
  , Level_2_Ready_Date = max(case when readinessLevelId = 2 then readinessLevelDate end)
  , Level_3_Ready_Date = max(case when readinessLevelId = 3 then readinessLevelDate end)
  , Level_4_Ready_Date = max(case when readinessLevelId = 4 then readinessLevelDate end)
  , Level_5_Ready_Date = max(case when readinessLevelId = 5 then readinessLevelDate end)
  , Level_6_Ready_Date = max(case when readinessLevelId = 6 then readinessLevelDate end)
  , Level_7_Ready_Date = max(case when readinessLevelId = 7 then readinessLevelDate end)
  , Level_8_Ready_Date = max(case when readinessLevelId = 8 then readinessLevelDate end)
  , Level_9_Ready_Date = max(case when readinessLevelId = 9 then readinessLevelDate end)
from ProjectReadinessLevel
where ProjectId = @Proj_ID
group by ProjectId;
end;
go