如何在所有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部分隐式?
不要将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的吗?