44

次のコードの何が問題なのかわかりません。構文は問題ありません (SQL Management Studio で確認済み)。必要に応じてアクセスできるので、それも機能します..しかし、何らかの理由で、テーブルを作成しようとするとすぐにPyODBC 経由で動作を停止します。

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.

これがなぜなのか誰にも分かりますか?Windows 2008 SQL Server 環境 (高速データベースではない) に対して Windows 7 を実行する "SQL Server" ドライバーをインストールしました (これはデフォルトです)。

4

10 に答える 10

99

孤独なネット遊牧民がこの問題に遭遇した場合に備えて、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
于 2013-02-20T12:21:21.677 に答える
11

スクリプトの先頭で「SET NOCOUNT ON」値を使用しても、問題を解決するには必ずしも十分ではありません。

私の場合、次の行も削除する必要がありました。

Use DatabaseName;

データベースは SQL Server 2012、Python 3.7、SQL Alchemy 1.3.8 でした

これが誰かに役立つことを願っています。

于 2019-11-20T03:15:21.610 に答える
3

Travis や他の人が述べたように、SET NOCOUNT ON が防げない余分な出力が他の原因で発生する可能性もあります。

手順の開始時に SET NOCOUNT ON を指定しましたが、結果セットに警告メッセージが表示されました。

エラー メッセージを削除するために、スクリプトの先頭で ansi 警告をオフに設定しました。

SET ANSI_WARNINGS OFF

うまくいけば、これは誰かを助けます。

于 2020-01-13T23:02:12.873 に答える
-1

最初に:

Windows SQL Server 2008 を実行している場合は、SQL ソフトウェアのインストールに含まれている「ネイティブ クライアント」を使用します (データベースとツールキットと共にインストールされるため、Microsoft から SQL 管理アプリケーションをインストールする必要があります)。

次に、SQL 接続ステートメントで「Trusted_Connection=yes」を使用します。

cnxn = pyodbc.connect('DRIVER={SQL Server Native Client 10.0};SERVER=ServerAddress;DATABASE=my_db;Trusted_Connection=yes')

これでうまくいくはずです!

于 2011-10-25T14:56:27.197 に答える