【问题标题】:SQL Server error 80040e14 Using Classic ASP in a Result SetSQL Server 错误 80040e14 在结果集中使用经典 ASP
【发布时间】:2018-10-23 04:33:36
【问题描述】:

我正在尝试使用经典的 ASP 和 SQL Server 从数据库中为向量的每个位置选择结果。到目前为止的代码:

FOR EACH x IN Tabela

    sql = "SELECT DISTINCT tborders.family AS family, tborders.qty AS qty, tborders.los AS los, CONVERT(DATE, tborders.mrd_date) AS mrd FROM [DASH].[dashboard_db].[dbo].[tb_family] AS tbfamily INNER JOIN [DASH].[dashboard_db].[dbo].[tb_started_zero] AS tborders ON tbfamily.[family] = tborders.[family] WHERE tborders.[Order Number] = "&x&""
    SET rs = conn.execute(sql)

    IF rs.EOF = false THEN
        mrd(counter) = rs("mrd") 
        family(counter) = rs("family") 
        los(counter) = rs("los") 
        qty(counter) = rs("qty") 
        counter=counter+1
    END IF

NEXT

注意tborders.[Order Number] 是一个int 类型的值。出于某种原因,我遇到了这个错误:

Microsoft SQL Server Native Client 11.0 错误“80040e14”

“=”附近的语法不正确。

/asplearning/act/validate-schedule-line.asp,第 46 行

我已尝试删除 SET,但我的结果集未被识别为对象。我很确定这些类型都很好,我试过了:

if isNumeric(x) THEN
        response.write("<h1>it is numeric</h1>")
        else
        response.write("<h1>not numeric</h1>")
    end if

它为Tabela 的每个位置写了“它是数字”。任何人都可以帮助解决这似乎是什么问题?

【问题讨论】:

  • 你真的应该考虑使用参数而不是建立一个字符串。此外,在 for each 循环中执行此类操作表明您可能会考虑基于此集合而不是 RBAR(逐行排列)。

标签: sql-server asp-classic


【解决方案1】:

看起来你有一个空项目(集合的第一个或最后一个项目)。

我强烈建议您使用 sp_executesql。这将使用已编译的执行计划,这将验证您的参数(针对 sql 注入)。

FOR EACH x IN Tabela
    if len(x) > 0 then
        sql = "exec sp_executeSql N'SELECT DISTINCT tborders.family AS family, tborders.qty AS qty, tborders.los AS los, CONVERT(DATE, tborders.mrd_date) AS mrd FROM [DASH].[dashboard_db].[dbo].[tb_family] AS tbfamily INNER JOIN [DASH].[dashboard_db].[dbo].[tb_started_zero] AS tborders ON tbfamily.[family] = tborders.[family] WHERE tborders.[Order Number] = @OrderNumber', N'@OrderNumber int', @orderNumber = " & x
        SET rs = conn.execute(sql)

        IF rs.EOF = false THEN
            mrd(counter) = rs("mrd") 
            family(counter) = rs("family") 
            los(counter) = rs("los") 
            qty(counter) = rs("qty") 
            counter=counter+1
        END IF
        rs.close
    end if
NEXT

【讨论】:

  • 谢谢!我肯定会考虑不为查询构建字符串。真的很乱。而且 exec sp_executeSql 真的很方便。另外,谢谢你的回答。大多数人都非常反对旧技术,并且仅仅因为将其作为标签而对问题投反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多