代码之家  ›  专栏  ›  技术社区  ›  Krishna Kumar

为什么我得到“服务器在编译时遇到堆栈溢出”错误是SQL server 2000 Sp4

  •  0
  • Krishna Kumar  · 技术社区  · 17 年前

    我试图在这个查询中有大约6290个“AND”条件。我在11945左右的“OR”条件下也会得到同样的结果。

    异常详细信息: 服务器在编译时遇到堆栈溢出。在系统。数据。 l客户。SqlConnection。OnError(SqlException异常,布尔中断连接) 在系统。数据。SqlClient。SqlInternal连接。OnError(SqlException除外 ,布尔断开连接)

    2 回复  |  直到 17 年前
        1
  •  2
  •   gbn    17 年前

    试着优化你的和/或条件。

    SELECT * FROM foo
    WHERE ([fooKey] = 1 AND Year = 1995)
    OR ([fooKey] = 1 AND Year = 1996)
    OR ([fooKey] = 1 AND Year = 1997)
    OR ([fooKey] = 1 AND Year = 1998)
    OR ([fooKey] = 1 AND Year = 1999)
    OR ([fooKey] = 1 AND Year = 2000)
    OR ([fooKey] = 1 AND Year = 2001)
    OR ([fooKey] = 1 AND Year = 2002)
    ... ad infinitum
    

    变成

    SELECT * FROM fooWHERE ([fooKey] = 1 AND Year between 1995 and 2002)
    union
    SELECT * FROM fooWHERE ([fooKey] = 10017 AND Year = 1995)
    union
    SELECT * FROM fooWHERE ([fooKey] = 10018 AND Year = 1997)
    ... slightly less
    

    或者转到64位并尝试添加足够的内存以避免这种情况发生。..

        2
  •  1
  •   Jesse Pepper    17 年前

    有趣的bug!要问你的明显问题是, 为什么? 堆栈溢出是因为递归是解析这样的SQL语句的典型方式,它构建了一个语法树。根据每次递归调用推送到堆栈上的内容,这并不奇怪。服务器受伤了吗? ;)