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

kiv*_*all 3 .net c# 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];
}
Run Code Online (Sandbox Code Playgroud)

那么有人可以解释那里的SELECT语句.最终结果(分钟)是预期的,所以它的工作原理,但语法混淆了我.这在某种程度上等于SELECT*FROM dbo.BusinessMinutes WHERE ...

这是常用的,这个语法有一些特殊的名称,所以我可以更好地命名我的问题?先感谢您.

小智 5

它不是表名.我想你召唤了一个功能.

如何在sql server 2008中创建和调用标量函数

有更多的解释和例子.

  • 这是标量函数,而不是表函数. (5认同)

Cro*_*ono 5

dbo.BusinessMinutes 必须是UDF(用户定义函数),它根据开始日期,结束日期和优先级指示符返回简单的标量值.

标量函数(无论是UDF还是本机函数)可以在SELECT语句中用于在返回的结果集中生成字段.因此,您拥有的代码是完全合法的.

有关标量UDF的更多信息,请阅读此MSDN文章.

作为旁注,该代码的更好实现是:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想要的只是初始化minutes变量,使用SqlDataReader将比创建a SqlDataAdapter和a 更有效率和高效DataTable.这些using陈述还将确保您SqlCommandSqlDataReader对象得到妥善处理.