MSSQL2008 - Pyodbc - Previous SQL was not a query

前端 未结 8 1388
我寻月下人不归
我寻月下人不归 2020-12-05 04:13

I can\'t figure out what\'s wrong with the following code, The syntax IS ok (checked with SQL Management Studio), i have access as i should so that works too.. but for some

相关标签:
8条回答
  • Using the "SET NOCOUNT ON" value at the top of the script will not always be sufficient to solve the problem.

    In my case, it was also necessary to remove this line:

    Use DatabaseName;
    

    Database was SQL Server 2012, Python 3.7, SQL Alchemy 1.3.8

    Hope this helps somebody.

    0 讨论(0)
  • 2020-12-05 04:42

    As others covered, SET NOCOUNT ON will take care of extra resultsets inside a stored procedure, however other things can also cause extra output that NOCOUNT will not prevent (and pyodbc will see as a resultset) such as forgetting to remove a print statement after debugging your stored procedure.

    0 讨论(0)
  • 2020-12-05 04:42

    In case your SQL is not Stored Proc.

    usage of 'xyz != NULL' in query, will give the same error i.e. "pyodbc.ProgrammingError: No results. Previous SQL was not a query."

    Use 'is not null' instead.

    0 讨论(0)
  • 2020-12-05 04:50

    I got this because I was reusing a cursor that I was looping over:

    rows = cursor.execute(...)
    for row in rows:
        # run query that returns nothing
        cursor.execute(...)
        # next iteration of this loop will throw 'Previous SQL' error when it tries to fetch next row because we re-used the cursor with a query that returned nothing
    

    Use 2 different cursors instead

    rows = cursor1.execute(...)
    for row in rows:
        cursor2.execute(...)
    

    or get all results of the first cursor before using it again:

    Use 2 different cursors instead

    rows = cursor.execute(...)
    for row in list(rows):
        cursor.execute(...)
    
    0 讨论(0)
  • 2020-12-05 04:50

    As Travis and others have mentioned, other things can also cause extra output that SET NOCOUNT ON will not prevent.

    I had SET NOCOUNT ON at the start of my procedure but was receiving warning messages in my results set.

    I set ansi warnings off at the beginning of my script in order to remove the error messages.

    SET ANSI_WARNINGS OFF
    

    Hopefully this helps someone.

    0 讨论(0)
  • 2020-12-05 04:57

    Just in case some lonely net nomad comes across this issue, the solution by Torxed didn't work for me. But the following worked for me.

    I was calling an SP which inserts some values into a table and then returns some data back. Just add the following to the SP :

    SET NOCOUNT ON
    

    It'll work just fine :)

    The Python code :

        query = "exec dbo.get_process_id " + str(provider_id) + ", 0"
        cursor.execute(query)
    
        row = cursor.fetchone()
        process_id = row[0]
    

    The SP :

    USE [DBNAME]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER procedure [dbo].[GET_PROCESS_ID](
        @PROVIDER_ID INT,
        @PROCESS_ID INT OUTPUT
    )
    AS
    BEGIN
        SET NOCOUNT ON
        INSERT INTO processes(provider_id) values(@PROVIDER_ID)
        SET @PROCESS_ID= SCOPE_IDENTITY()
        SELECT @PROCESS_ID AS PROCESS_ID
    END
    
    0 讨论(0)
提交回复
热议问题