我正在开发一个我需要稍微修改的程序。有一个SQL语句我不明白它的作用(或基本上它是如何做的)。
string query = "SELECT dbo.BusinessMinutes(@start,@end,@priorityid)";
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.Add("@start", SqlDbType.DateTime).Value = start;
cmd.Parameters.Add("@end", SqlDbType.DateTime).Value = end;
cmd.Parameters.Add("@priorityid", SqlDbType.UniqueIdentifier).Value = priorityId;
SqlDataAdapter READER = new SqlDataAdapter();
READER.SelectCommand = cmd;
DataTable table = new DataTable();
READER.Fill(table);
if (table.Rows.Count == 1)
{
minutes = (int)table.Rows[0][0];
}
那么有人可以解释那里的SELECT语句。最终结果(分钟)是预期的,所以它的工作原理,但语法混淆了我。这在某种程度上等于SELECT * FROM dbo.BusinessMinutes WHERE ...
这是否常用,这种语法是否有一些特殊的名称,所以我可以更好地命名我的问题?提前谢谢。
答案 0 :(得分:5)
答案 1 :(得分:5)
dbo.BusinessMinutes
必须是UDF(用户定义函数),它根据开始日期,结束日期和优先级指示符返回简单的标量值。
标量函数,无论是UDF还是本机函数,都可以在SELECT
语句中用于在返回的结果集中生成字段。因此,您拥有的代码完全合法。
有关标量UDF的更多信息,请阅读此MSDN article。
作为旁注,该代码的更好实现是:
string query = "SELECT dbo.BusinessMinutes(@start,@end,@priorityid)";
using (SqlCommand cmd = new SqlCommand(query, con))
{
cmd.Parameters.Add("@start", SqlDbType.DateTime).Value = start;
cmd.Parameters.Add("@end", SqlDbType.DateTime).Value = end;
cmd.Parameters.Add("@priorityid", SqlDbType.UniqueIdentifier).Value = priorityId;
// assuming connection is already open
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read()) minutes = reader.GetInt32(0);
}
}
如果你想要的只是初始化minutes
变量,那么使用SqlDataReader
比创建SqlDataAdapter
和DataTable
更有效率和高效率。 using
语句还可确保您的SqlCommand
和SqlDataReader
个对象得到妥善处理。