Как получить возвращаемое значение хранимой процедуры SQL Server, используя pyodbc?

Моя команда использует вики-сервер на основе Python, который вызывает хранимые процедуры в базе данных SQL Server. В идеале мы хотели бы вернуть целочисленные значения (1,0,-1) из хранимой процедуры, чтобы показать основные результаты.

Согласно ветке 2008 года в группах Google, возвращаемые значения не поддерживаются pyod bc, поэтому альтернативой является ВЫБРАТЬ результат в виде строки и проверить его. Это все еще так? Существует ли (поддерживаемый и задокументированный) программный способ проверки возвращаемого значения хранимых процедур SQL? (Если это так, пожалуйста, добавьте текущую ссылку или пример.)

4 ответа

Решение

Вот некоторая соответствующая информация: http://code.google.com/p/pyodbc/wiki/StoredProcedures

Похоже, возвращаемые значения по-прежнему не поддерживаются, поэтому вам нужно будет использовать SELECT,

Я использую это:

def CallStoredProc(conn, procName, *args):
    sql = """DECLARE @ret int
             EXEC @ret = %s %s
             SELECT @ret""" % (procName, ','.join(['?'] * len(args)))
    return int(conn.execute(sql, args).fetchone()[0])

Он работает только на SQL Server (или, возможно, Sybase), но это достойный обходной путь.

Я добавил следующее, чтобы заставить его работать в моем приложении:

def CallStoredProc(conn, procName, *args):
    sql = """SET NOCOUNT ON;
         DECLARE @ret int
         EXEC @ret = %s %s
         SELECT @ret""" % (procName, ','.join(['?'] * len(args)))
    return int(conn.execute(sql, args).fetchone()[0])

Я использовал аналогичное решение Гейба, и мне нужны были именованные параметры:

      def call_stored_procedure(conn, procName, **args):
    query = ""
    for key, value in  args.items():
        query = query+',@'+key+'='+'\"'+str(value)+'\"'
    query = query[ 1:]

    sql = """   SET QUOTED_IDENTIFIER OFF
                SET ANSI_NULLS ON 
                SET NOCOUNT ON
                DECLARE @ret int
                 
                 EXEC @ret = %s %s       

                COMMIT 
                SELECT @ret""" % (procName, query)

    id = conn.execute(sql).fetchone()[0]

call_stored_procedure(conn, "MY_StoredProcedure", **payload)
Другие вопросы по тегам