代码之家  ›  专栏  ›  技术社区  ›  nosklo

SQL Server函数本机参数绑定错误

  •  7
  • nosklo  · 技术社区  · 15 年前

    我在Ubuntu 10.04 Lucid LTS上使用以下软件栈 连接到数据库:

    1. python 2.6.5(Ubuntu包)
    2. pyodbc git trunk提交 eb545758079a743b2e809e2e219c8848bc6256b2
    3. unixodc 2.2.11(Ubuntu包)
    4. freetds 0.82(Ubuntu软件包)
    5. 带Microsoft SQL Server 2000(8.0)的Windows

    当尝试在参数中进行本机参数绑定时,会出现此错误 到SQL Server函数:

    Traceback (most recent call last):
     File "/home/nosklo/devel/testes/sqlfunc.py", line 32, in <module>
       cur.execute("SELECT * FROM fn_FuncTest(?)", ('test',))
    pyodbc.ProgrammingError: ('42000', '[42000] [FreeTDS][SQL
    Server]SqlDumpExceptionHandler: Process 54 generated fatal exception
    c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this
    process.\r\n (0) (SQLPrepare)')
    

    这是复制代码:

    import pyodbc
    constring = 'server=myserver;uid=uid;pwd=pwd;database=db;TDS_Version=8.0;driver={FreeTDS}'
    
    con = pyodbc.connect(constring)
    print 'VERSION: ', con.getinfo(pyodbc.SQL_DBMS_VER)
    
    cur = con.cursor()
    try:
       cur.execute('DROP FUNCTION fn_FuncTest')
       con.commit()
       print "Function dropped"
    except pyodbc.Error:
       pass
    
    cur.execute('''
       CREATE FUNCTION fn_FuncTest (@testparam varchar(4))
       RETURNS @retTest TABLE (param varchar(4))
       AS
       BEGIN
           INSERT @retTest
           SELECT @testparam
           RETURN
       END''')
    con.commit()
    

    现在函数被创建。如果我尝试在查询中使用值直接调用它(没有值的本机绑定),它会正常工作:

    cur.execute("SELECT * FROM fn_FuncTest('test')")
    assert cur.fetchone()[0] == 'test'
    

    但是,当我尝试执行本机绑定时(通过使用参数占位符并分别传递值),会得到上面的错误:

    cur.execute("SELECT * FROM fn_FuncTest(?)", ('test',))
    

    进一步调查显示 奇怪的 我想谈的事情:

    • 如果我将TDS版本改为4.2,一切都可以正常工作(但是, 来自SQL Server的版本报告错误--使用TDS版本 4.2 我得到 '95.08.0255' 而不是真正的版本 '08.00.0760' )
    • 对于其他两种类型的函数,一切都可以正常工作-> 返回值的函数和仅为select的函数 查询(像视图)都可以正常工作。甚至可以定义一个新函数 返回另一个(中断的)函数的查询结果,以及 这样一切都能正常工作, 即使在上执行本机绑定 参数 . 例如: CREATE FUNCTION fn_tempFunc(@testparam varchar(4)) RETURNS TABLE AS RETURN (SELECT * FROM fn_FuncTest(@testparam))
    • 这个错误之后,连接变得非常不稳定,您无法恢复。
    • 尝试绑定任何类型的数据时都会发生错误。

    我怎样才能更进一步?我想对函数参数进行本机绑定。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Nicholas Knight    15 年前

    最终,这可能不是您要寻找的答案,但是当我在两三年前从Perl连接到MSSQL时,最初涉及到了ODBC+Freetds,但我没能找到它(尽管我不记得具体的错误,但我试图进行绑定,而且它似乎一些问题的根源)。

    在Perl项目中,我最终使用了一个针对Sybase的驱动程序(这是MSSQL派生出来的),所以您可能需要研究一下。

    python wiki在Sybase上有一个页面,在SQL Server上有另一个页面,您可能需要仔细阅读以寻找替代方案:

    http://wiki.python.org/moin/Sybase

    http://wiki.python.org/moin/SQL%20Server