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

本文关键字:where 一部分 子句 select 语句 | 更新日期: 2023-09-27 18:22:51

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

select * from table where ... and  Year = '2012' 

例如

是否有任何方法可以重构这些查询,以使"and Year="2012部分隐式?

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

不要将DateTime作为字符串传递。使用SQL命令并将其作为DateTime.Now.Tear()

短代码示例:

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/ms1175876.aspx)然后对快照运行查询(http://blogs.msdn.com/b/sqlcat/archive/2007/06/06/querying-a-database-snapshot.aspx)只要你知道快照,你就不需要包括年份。

把它改成... And Year = year(getdate()) 怎么样

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