【问题标题】:Explain me this SELECT dbo.TableName(@variable) statement解释一下这个 SELECT dbo.TableName(@variable) 语句
【发布时间】:2014-05-16 20:29:45
【问题描述】:

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

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

【问题讨论】:

  • dbo.BusinessMinutes 是一个用户定义函数

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


【解决方案1】:

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 对象得到正确处理。

【讨论】:

    【解决方案2】:

    这不是表名。我认为你调用了一个 FUNCTION。

    how to create and call scalar function in sql server 2008

    有更多的解释和例子。

    【讨论】:

    • 这是一个标量函数,不是表函数。
    • 已更正。忽略了调用中的返回。
    • 是的。现在我什至有一个 stackoverflow 内部链接 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多