sql server函数本机参数绑定错误

时间:2010-06-29 18:38:37

标签: python sql-server pyodbc freetds unixodbc

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

  1. python 2.6.5(ubuntu package)
  2. pyodbc git trunk commit eb545758079a743b2e809e2e219c8848bc6256b2
  3. unixodbc 2.2.11(ubuntu package)
  4. freetds 0.82(ubuntu package)
  5. Windows with Microsoft SQL Server 2000(8.0)
  6. 尝试在参数中进行原始参数绑定时出现此错误 到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()
    

    现在创建了该功能。如果我尝试在查询中使用direct值调用它(没有本机值的值),它可以正常工作:

    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')。
    • 其他两种功能的一切正常 - &gt; 返回值的函数和只是SELECT的函数 查询(如视图)都工作正常。您甚至可以定义新功能 它返回另一个(损坏的)函数的查询结果,和 这样一切都会起作用,即使在做本地绑定时也是如此 参数即可。例如:CREATE FUNCTION fn_tempFunc(@testparam varchar(4)) RETURNS TABLE AS RETURN (SELECT * FROM fn_FuncTest(@testparam))
    • 此错误导致连接变得非常不稳定,无法恢复。
    • 尝试绑定任何类型的数据时发生错误。

    我如何进一步追求这个?我想对函数参数进行原生绑定。

1 个答案:

答案 0 :(得分:0)

最终,这可能不是您正在寻找的答案,但是当我不得不在两三年前从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