我们有一个用asp.net/c#编写的web应用程序,并在我们的数据库中使用sql server作为SGBD,在几乎表中,我们有一个名为'YEAR'的列,所以在很多select
语句中我们有
select * from table where ... and Year = '2012'
例如
有没有办法重构这些查询以使'and Year ='2012''部分隐含?
答案 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吗?