未使用的sql参数 - 它们有什么危害吗?

时间:2010-09-28 14:51:11

标签: sql-server ado.net

请考虑以下代码:

Dim sql = "SELECT * FROM MyTable WHERE value1 = @Param1"

If someCondition Then
   sql = sql + " AND value2 = @Param2"
End If

Dim cmd As New SqlCommand(sql, conn)
cmd.Parameters.AddWithValue("@Param1", param1Value)
cmd.Parameters.AddWithValue("@Param2", param2Value)

假设我动态构建了一个复杂的sql语句,可能包含或不包含@Param2参数 - 将它作为参数添加到命令有什么危害吗?

我的真实用例显然比这复杂得多,但总的来说,这是我应该避免的模式;如果是这样,为什么?

2 个答案:

答案 0 :(得分:1)

我要注意的唯一一点是,如果你调用.AddWithValue,你可以将它留给SQL Server来弄清楚参数的数据类型是什么。

SQL Server在猜测方面做得非常出色 - 但有时候,它会“次优”,并且提供详细信息会对你有所帮助。

所以我个人倾向于总是使用这段代码:

SqlParameter aParam = new SqlParameter("@Param1", SqlDbType.VarChar, 50);
aParam.Value = param1Value;

这有两个主要好处:

  • 您可以定义显式类型,这很重要,例如:使用VARCHAR与NVARCHAR时(否则可能会产生大量不必要的类型转换)
  • 您可以定义最大长度,例如:字符串参数

您可以轻松地将其包装在例如static helper类,甚至将它用作扩展方法。

这是一项更多的工作,但是您可以获得更多控制权,并且可以避免不必要的,耗时的数据类型转换和其他意外的副作用,如果您将其留给SQL Server来猜测您的类型。

答案 1 :(得分:0)

避免传递不需要的参数始终是最佳做法。如果你传入一个没有值的参数,那么它要么假设你正在寻找一个NULL,空字符串,要么它会给你一个无法处理请求的错误。