C# and SQL Server 2005

本文关键字:2005 Server SQL and | 更新日期: 2023-09-27 18:19:28

我有4个表,从中提取记录。前三个表需要和公共行进行内部联接,但对于第四个表,我需要左外部联接,因为我必须保留前三个表格中已经提取的行。

现在,问题是我想左联接第四个表,但它应该只选择日期=当前日期的记录。在调用存储过程时,我正在从C#传递当前日期。但问题是SQL Server提供了空记录。

以下是查询::

alter procedure
  (@currentdate varchar(50))
  select distinct 
      table1.name, table2.class,table3.stream 
  from 
      table1
  inner join 
      table 2 on table1.id = table2.id 
  inner join 
      table3 on table3.id=table2.id   
  left outer join 
      table 4 on table 4.id = table3.id and table4.date = @currentdate

我使用和和左外部联接,因为我想要这样的记录,其中as使用where子句过滤整个结果,只给我一条记录。

然后我在存储过程中使用了带有两个日期的casting,但没有正面响应。

从C#我正在使用

var date = datetime.now.toshortdate();
CallStoredProcedure(date)

请尽快帮我。感谢

C# and SQL Server 2005

首先,您应该为日期使用适当的类型,即DATETIME-如果可以避免,请不要将日期转换为字符串并返回!

其次:SQL Server中的DATETIME和.NET中的DateTime都有日期和时间信息,例如2013-06-23 14:57:34,因此如果您在JOIN条件中进行相等比较,则只会选择与您的日期和时间完全匹配的行。因此,如果你只想用日期进行比较,你需要去掉时间部分。

所以在这里试试这个代码:

ALTER PROCEDURE dbo.YourProcedureNameHere (@currentdate DATETIME)
  SELECT DISTINCT
      table1.name, table2.class, table3.stream 
  FROM
      dbo.table1
  INNER JOIN
      dbo.table2 ON table1.id = table2.id 
  INNER JOIN
      dbo.table3 ON table3.id = table2.id   
  LEFT OUTER JOIN
      table 4 ON table 4.id = table3.id 
              AND DATEADD(DAY, DATEDIFF(DAY, 0, table4.date), 0) = 
                  DATEADD(DAY, DATEDIFF(DAY, 0, @currentdate), 0)

这会去掉table4.date@currentdate的时间部分,然后将在仅日期进行比较(不涉及时间)。更新到SQLServer2008或更新版本后,我建议您使用DATE数据类型,它正是为此而设计的—只存储日期(无时间)。遗憾的是,这在SQLServer2005中还不可用。

此外,从C#-使用此行调用您的存储过程:

var date = Datetime.Today;
CallStoredProcedure(date);