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

时间:2012-02-04 23:53:03

标签: c# asp.net sql-server

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

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

例如

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如何将其更改为... And Year = year(getdate())

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