【问题标题】:sql server function native parameter bind errorsql server 函数原生参数绑定错误
【发布时间】:2011-03-09 19:01:38
【问题描述】:

我在 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. 带有 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))
  • 出现此错误后连接变得非常不稳定,您无法恢复。
  • 尝试绑定任何类型的数据时都会发生错误。

我该如何进一步追求?我想对函数参数进行本机绑定。

【问题讨论】:

  • 进程 54 生成致命异常 c0000005 EXCEPTION_ACCESS_VIOLATION:您最好联系产品支持。至少在connect.microsoft.com/SQLServer 上报告此问题,确保从服务器的 LOG 文件夹中附加 .mdmp 文件。产品团队可能会提供解决方法。
  • @Remus Rusanu:对 SQL SERVER 2000 的基本支持早已结束。扩展支持似乎无法涵盖这一点。我也不认为微软在使用 freetds odbc 驱动程序时会有所帮助。

标签: python sql-server pyodbc freetds unixodbc


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2018-01-07
    • 1970-01-01
    • 2018-11-15
    相关资源
    最近更新 更多