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

nos*_*klo 7 python sql-server unixodbc pyodbc freetds

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

  1. python 2.6.5(ubuntu包)
  2. pyodbc git trunk commit eb545758079a743b2e809e2e219c8848bc6256b2
  3. unixodbc 2.2.11(ubuntu包)
  4. freetds 0.82(ubuntu包)
  5. Windows与Microsoft SQL Server 2000(8.0)

尝试在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)')
Run Code Online (Sandbox Code Playgroud)

这是再现代码:

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()
Run Code Online (Sandbox Code Playgroud)

现在该功能已创建.如果我尝试使用查询中的值直接调用它(没有本机绑定的值),它可以正常工作:

cur.execute("SELECT * FROM fn_FuncTest('test')")
assert cur.fetchone()[0] == 'test'
Run Code Online (Sandbox Code Playgroud)

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

cur.execute("SELECT * FROM fn_FuncTest(?)", ('test',))
Run Code Online (Sandbox Code Playgroud)

进一步的调查揭示了一些我想谈的奇怪的东西:

  • 如果我改变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))
  • 此错误后连接变得非常不稳定,无法恢复.
  • 尝试绑定任何类型的数据时发生错误.

我怎样才能进一步追求这个?我想对函数参数进行原生绑定.

Nic*_*ght 0

最终,这可能不是您正在寻找的答案,但是当我两三年前不得不从 Perl 连接到 MSSQL 时,最初涉及了 ODBC + FreeTDS,但我没有得到任何结果(尽管我不记得具体的错误,不过,我试图进行绑定,这似乎是一些麻烦的根源)。

在 Perl 项目中,我最终使用了一个用于 Sybase 的驱动程序(MSSQL 是从 Sybase 中分叉出来的),所以你可能想研究一下。

Python wiki 有一个关于 Sybase 的页面和另一个关于 SQL Server 的页面,您可能需要仔细阅读以获取替代方案:

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

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