1. ホーム
  2. python

[解決済み] MSSQL2008 - Pyodbc - 前の SQL はクエリではありません。

2022-03-04 02:35:42

質問

以下のコードのどこが問題なのかがわかりません。 構文はOKで(SQL Management Studioでチェック)、アクセスもちゃんとできているので、それも動作します。

import pyodbc

def SQL(QUERY, target = '...', DB = '...'):
    cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + target + DB+';UID=user;PWD=pass')
    cursor = cnxn.cursor()
    cursor.execute(QUERY)
    cpn = []

    for row in cursor:
        cpn.append(row)
    return cpn

print SQL("CREATE TABLE dbo.Approvals (ID SMALLINT NOT NULL IDENTITY PRIMARY KEY, HostName char(120));")

で失敗します。

Traceback (most recent call last):
  File "test_sql.py", line 25, in <module>
    print SQL("CREATE TABLE dbo.Approvals (ID SMALLINT NOT NULL IDENTITY PRIMARY KEY, HostName char(120));")
  File "test_sql.py", line 20, in SQL
    for row in cursor:
pyodbc.ProgrammingError: No results.  Previous SQL was not a query.

どなたか、この原因に心当たりのある方はいらっしゃいますか? SQL Serverのドライバをインストールし(デフォルト)、Windows 7をWindows 2008のSQL Server環境(Expressデータベースではない)で動かしています。

解決方法は?

この問題に遭遇する孤独なネットノマドがいることを想定して、Torxedによる解決策は私にはうまくいきませんでした。でも、以下の方法でうまくいきました。

私は、テーブルにいくつかの値を挿入し、いくつかのデータを返すSPを呼び出していました。ただ、SPに以下を追加してください。

SET NOCOUNT ON

うまくいくよ :)

Pythonのコード:

    query = "exec dbo.get_process_id " + str(provider_id) + ", 0"
    cursor.execute(query)

    row = cursor.fetchone()
    process_id = row[0]

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