C# 如何在所有select语句中隐式附加列作为where子句的一部分

C# 如何在所有select语句中隐式附加列作为where子句的一部分,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我们有一个用asp.net/c编写的web应用程序,在我们的数据库中使用sql server作为SGBD。在几乎所有的表中,我们都有一个名为“YEAR”的列,所以在很多select语句中都有 select * from table where ... and Year = '2012' 比如说 有没有办法重构这些查询以使'and Year='2012部分隐式?不要将日期时间作为字符串传递。使用SQL命令并将其作为 DateTime.Now.催泪 简短代码示例: void int SQLQu

我们有一个用asp.net/c编写的web应用程序,在我们的数据库中使用sql server作为SGBD。在几乎所有的表中,我们都有一个名为“YEAR”的列,所以在很多select语句中都有

select * from table where ... and  Year = '2012' 
比如说


有没有办法重构这些查询以使'and Year='2012部分隐式?

不要将日期时间作为字符串传递。使用SQL命令并将其作为 DateTime.Now.催泪

简短代码示例:

void int SQLQueryWith Implicit Date() { 
    // Create a sql statement with a parameter (@ImplicitYear) 
    string sql = @"SELECT rank = Count(*) 
                   FROM   table 
                   WHERE  table.date >= @ImplicitYear"; 


// Create a sql connection 
// Always use the using statement for this 

using (var connection = new SqlConnection(connectionString)) { 

    // Create a sql command 
    // Always use the using statement for this 
    using (var command = new SqlCommand(sql, connection)) { 

        // Pass the dateinput argument to the command, and let 
        // the .NET Framework handle the conversion properly! 
        command.Parameters.Add(new SqlCommand("ImplicitYear", DateTime.Now.Year())); 

        // No need for calling .Close() or .Dispose() - the using 
        // statements handle that for us 
        return (int)command.ExecuteScalar(); 
    }  
或者,如果数据库端有一个存储过程,则可以将其隐式地包含在存储过程中,并只传递所需的参数

根据更新的信息进行编辑

您可以通过一个查询在数据库端创建临时表,将每个查询分为不同的年份。您可以通过一个查询对所有表执行此操作,如果您指向正确的表,则可以从其余查询中删除年份

其他想法: 我不太清楚这是如何工作的,但基于一点研究,您可以为每年创建筛选的数据库快照,并在服务器端每天更新它们。msdn.microsoft.com/en-us/library/ms175876.aspx
然后对快照运行查询,只要知道快照,就不需要包含年份。

将其更改为。。。And Year=yeargetdate


这将始终检索当前年份。如果这不起作用,那么您能再解释一下代码是如何设计和构建SQL的吗?

您所说的重构是什么意思?@anouar204取决于您构建SQL语句所使用的一种或多种方法。有一个代码示例吗?我们不想一直在查询中添加“and Year=…”,因此如果您有任何想法可以帮助您,那就很好了great@jordanhill123数据访问层是用纯ado.net编写的,问题是当我们编写新特性时,我们可能忘记添加查询中无处不在的部分,这就是为什么我们正在寻找一种方法使其隐式“自动”@jordanhill123可能类似于为数据库创建虚拟实例,对于每个实例,我们都有一个唯一的年份值column Year就是一个例子,我们可以说所有数据库表中都有一个列;例如,假设我们在wich中有一个表,其中100行的年份为'2012',200行的年份为'2011',我的问题是,我们是否可以对所有表进行全局投影,只过滤年为'2012'的行,这样我们就不必把年为'2012'的行放在一起,在我们编写一个新的querylet时,我们会说我们有30个表,20个表的主题有一个'Year'列,数据库有过去5年的数据,假设我们对一次一年的数据感兴趣,所以我们从下拉列表中选择年份,有没有办法进行全局预测,这样我们就可以从我们的查询中删除“…和year=”,您想在这些表上为您的预测做一个联接?如果没有,您可以在数据库端创建临时表,其中一个查询将每个临时表分为不同的年份。您可以通过一个查询对所有表执行此操作,然后如果您指向正确的表,则从其余查询中删除年份。我要寻找的是一种查看整个数据库的方法,该数据库一次只包含一年的数据time@anouar204取决于你想从哪一方做这项工作……我给了你不同的选择但这取决于你的情况。哪种方法听起来可能适合您,这样我就可以详细说明我要寻找的内容,如果sqlserver上有虚拟快照支持,那就太好了