【问题标题】:Parameterized query - An expression of non-boolean type specified in a context where a condition is expected, near 'END'参数化查询 - 在预期条件的上下文中指定的非布尔类型表达式,靠近“END”
【发布时间】:2014-05-12 16:51:00
【问题描述】:

我有以下代码:

Dim sqlQuery As String = "IF NOT EXISTS ( SELECT * FROM myTable WHERE columnId = @columnId AND sourceId = @sourceId AND value = @value ) "
sqlQuery += "BEGIN "
sqlQuery += "INSERT INTO myTable SELECT @columnId, @sourceId, @value, " & data & " FROM otherTable WHERE sourceId = @sourceId AND @query END"

Using cn As New SqlConnection(connectStr), _
    cmd As New SqlCommand(sqlQuery, cn)

    cmd.Parameters.Add("@columnId", Data.SqlDbType.Int).Value = columnId
    cmd.Parameters.Add("@sourceId", Data.SqlDbType.Int).Value = sourceId
    cmd.Parameters.Add("@value", Data.SqlDbType.NVarChar).Value = value
    cmd.Parameters.Add("@query", Data.SqlDbType.NVarChar).Value = query

    cn.Open()
    cmd.ExecuteNonQuery()
End Using

除@query 之外,所有其他参数化查询都有效。我收到一个异常,上面写着“在预期条件的上下文中指定的非布尔类型的表达式,靠近‘END’。”我不确定我做错了什么。使用 SQL Server 2008 R2。

【问题讨论】:

  • 你向@query发送什么样的值?
  • 诸如“category = 1”或“country = US”之类的东西
  • 好吧,country = US 需要是 country = 'US'(例如)。基本上那个错误是说你在 sqlQuery 中的 SQL 语法是无效的,所以也许发布 sqlQuery 的格式错误的值可以帮助我们(或你)调试它。
  • 实际上,我认为您的问题是 @query 可以为空白,因此您的查询看起来像 "IF NOT() BEGIN SELECT * FROM TABLE WHERE A=1 AND END" 和 "AND END" 抛出错误。
  • 这并不是严格的测试方法。请在出现此错误时发布 sqlQuery 的值。

标签: sql sql-server vb.net sqlexception parameterized-query


【解决方案1】:

AND @Query 表示@Query 的内容必须可解析为布尔条件。

例如,

DECLARE @Query NVARCHAR(MAX);
DECLARE @cmd NVARCHAR(MAX);
SET @Query = '''TEST'' = ''MONKEY''';
SET @cmd = 'SELECT 1 WHERE ' + @Query + ';';

EXEC sp_executesql @cmd;

GO

DECLARE @Query NVARCHAR(MAX);
DECLARE @cmd NVARCHAR(MAX);
SET @Query = '''TEST''';
SET @cmd = 'SELECT 1 WHERE ' + @Query + ';';

EXEC sp_executesql @cmd;

第一个查询是有效的,因为我们正在检查是否'TEST' = 'MONKEY';但是第二个查询无效,因为我们正在检查 'TEST' 是否没有指定我们将 'TEST' 与什么进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    相关资源
    最近更新 更多