解释一下这个SELECT dbo.TableName(@variable)语句

时间:2014-04-04 13:31:19

标签: c# .net sql-server ado.net

我正在开发一个我需要稍微修改的程序。有一个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 ...

这是否常用,这种语法是否有一些特殊的名称,所以我可以更好地命名我的问题?提前谢谢。

2 个答案:

答案 0 :(得分:5)

它不是表名。我想你召集了一个功能。

how to create and call scalar function in sql server 2008

有更多解释和示例。

答案 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比创建SqlDataAdapterDataTable更有效率和高效率。 using语句还可确保您的SqlCommandSqlDataReader个对象得到妥善处理。