pyodbc不报告sql

2024-04-18 02:26:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个问题,pyodbc无法捕获从存储过程返回的错误。我实际的存储过程做了很多工作,但是为了演示这个错误,我创建了一个简单的proc和相关的python代码。相关代码如下:

存储过程:

CREATE PROCEDURE [dbo].[testErrors]
    -- Add the parameters for the stored procedure here

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- Insert statements for procedure here
    insert into Parameter(Name, Units, DataType) values (null, null, null)
END

GO

Python代码:

^{pr2}$

我得到了预期的错误:

 cursor.execute("exec testErrors")
pyodbc.IntegrityError: ('23000', "[23000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert the value NULL into column 'Name', table 'Parametrics.dbo.Parameter'; column does not allow nulls. INSERT fails. (515) (SQLExecDirectW); [01000] [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been terminated. (3621)")

但是,当我修改存储过程以包含select语句时,错误不再返回到python代码中。Python代码就像没有发生错误一样退出。在

更新的存储过程:

CREATE PROCEDURE [dbo].[testErrors]
    -- Add the parameters for the stored procedure here

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    select 108
    -- Insert statements for procedure here
    insert into Parameter(Name, Units, DataType) values (null, null, null)
END

GO

当结果记录通过select语句交错时,pyodbc似乎看不到错误。这里的问题是什么?有没有办法克服这个问题?在

编辑:我用pymssql尝试了这个方法,看到了相同的行为


Tags: the代码forsqlhereserveron过程
1条回答
网友
1楼 · 发布于 2024-04-18 02:26:59

我可以使用pypyodbc在python3.4.3中重新创建您的问题,也可以使用ADO使用VBScript重新创建您的问题。看起来,一旦存储过程发出了结果集,ODBC会注意到SP返回了某些东西,并且SP中的后续错误不会触发调用过程中的错误。在

一种可能的解决方法是构造存储过程,使其在结束之前不会生成任何结果集。如果T-SQL代码在执行任何创建结果集的SELECT之前遇到错误,则错误将被传递回调用者。例如,这个经过调整的存储过程版本确实抛出了py[py]odbc可以捕捉到的错误:

CREATE PROCEDURE [dbo].[Table1sp] AS
BEGIN
    DECLARE @foo int;
    SET NOCOUNT ON;
    SELECT @foo = 108;
    INSERT INTO Table1 (textcol) VALUES (NULL);    error here
    SELECT @foo AS foo
END

相关问题 更多 >