我在 Ubuntu 10.04 Lucid LTS 上使用以下软件堆栈来 连接到数据库:
- python 2.6.5(ubuntu 包)
- pyodbc git trunk commit
eb545758079a743b2e809e2e219c8848bc6256b2
- unixodbc 2.2.11(ubuntu 包)
- freetds 0.82(ubuntu 包)
- Windows 和 Microsoft SQL Server 2000 (8.0)
尝试在参数中进行 native 参数绑定(bind)时出现此错误 到 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()
现在函数已创建。如果我尝试在查询中直接使用值调用它(没有值的 native 绑定(bind))它工作正常:
cur.execute("SELECT * FROM fn_FuncTest('test')")
assert cur.fetchone()[0] == 'test'
但是,当我尝试执行 native 绑定(bind)(通过使用参数占位符并单独传递值)时,出现了上述错误:
cur.execute("SELECT * FROM fn_FuncTest(?)", ('test',))
进一步的调查揭示了一些奇怪的东西,我想说一下:
- 如果我将 TDS 版本更改为 4.2,一切正常(但是,
来自 sql server 的版本报告是错误的——我使用的是 TDS 版本
4.2
'95.08.0255'
而不是真正的版本'08.00.0760'
). - 其他两种类型的函数一切正常 ->
返回值的函数和只是 SELECT 的函数
查询(如 View )都可以正常工作。你甚至可以定义一个新函数
返回对另一个(损坏的)函数的查询结果,并且
这样一切都会工作,即使在
参数。例如:
CREATE FUNCTION fn_tempFunc(@testparam varchar(4)) 返回表作为返回(SELECT * FROM fn_FuncTest(@testparam))
- 此错误后连接变得非常不稳定,您无法恢复。
- 尝试绑定(bind)任何类型的数据时都会发生错误。
我怎样才能进一步追求这个?我想对函数参数进行 native 绑定(bind)。
最佳答案
最终,这可能不是您要寻找的答案,但是当我在两三年前不得不从 Perl 连接到 MSSQL 时,最初涉及 ODBC + FreeTDS,但我没有得到任何结果(虽然我不记得具体的错误,但我试图进行绑定(bind),但它似乎是一些问题的根源)。
在 Perl 项目中,我最终使用了一个用于 Sybase 的驱动程序(MSSQL 从中分离出来),所以您可能想研究一下。
Python wiki 有一个关于 Sybase 的页面和另一个关于 SQL Server 的页面,您可能想要仔细阅读以寻找替代方案:
关于python - sql server函数 native 参数绑定(bind)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3143704/