How do you get output parameters from a stored procedure in Python?

前端 未结 9 1798
既然无缘
既然无缘 2020-12-20 13:40

I\'ve googled around a bit, but maybe I didn\'t put the correct magik incantation into the search box.

Does anyone know how to get output parameters from a stored p

相关标签:
9条回答
  • 2020-12-20 14:22

    You can try to reformat query:

    import pypyodc
    
    connstring = "DRIVER=SQL Server;"\
                 "SERVER=servername;"\
                 "PORT=1043;"\
                 "DATABASE=dbname;"\
                 "UID=user;"\
                 "PWD=pwd"
    
    conn = pypyodbc.connect(connString)
    cursor = conn.cursor()
    
    query="DECLARE @ivar INT \r\n" \
          "DECLARE @svar VARCHAR(MAX) \r\n" \
          "EXEC [procedure]" \
          "@par1=?," \
          "@par2=?," \
          "@param1=@ivar OUTPUT," \
          "@param2=@svar OUTPUT \r\n" \
          "SELECT @ivar, @svar \r\n"
    par1=0
    par2=0
    params=[par1, par2]
    result = cursor.execute(query, params)
    print result.fetchall()
    

    [1]https://amybughunter.wordpress.com/tag/pypyodbc/

    0 讨论(0)
  • 2020-12-20 14:27

    2016 update (callproc support in pymssql 2.x)

    pymssql v2.x offers limited support for callproc. It supports OUTPUT parameters using the pymssql.output() parameter syntax. Note, however, that OUTPUT parameters can only be retrieved with callproc if the stored procedure does not also return a result set. That issue is discussed on GitHub here.

    For stored procedures that do not return a result set

    Given the T-SQL stored procedure

    CREATE PROCEDURE [dbo].[myDoubler] 
        @in int = 0, 
        @out int OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON;
        SELECT @out = @in * 2;
    END
    

    the Python code

    import pymssql
    conn = pymssql.connect(
        host=r'localhost:49242',
        database='myDb',
        autocommit=True
        )
    crsr = conn.cursor()
    
    sql = "dbo.myDoubler"
    params = (3, pymssql.output(int, 0))
    foo = crsr.callproc(sql, params)
    print(foo)
    conn.close()
    

    produces the following output

    (3, 6)
    

    Notice that callproc returns the parameter tuple with the OUTPUT parameter value assigned by the stored procedure (foo[1] in this case).

    For stored procedures that return a result set

    If the stored procedure returns one or more result sets and also returns output parameters, we need to use an anonymous code block to retrieve the output parameter value(s):

    Stored Procedure:

    ALTER PROCEDURE [dbo].[myDoubler] 
        @in int = 0, 
        @out int OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON;
        SELECT @out = @in * 2;
        -- now let's return a result set, too
        SELECT 'foo' AS thing UNION ALL SELECT 'bar' AS thing;
    END
    

    Python code:

    sql = """\
    DECLARE @out_value INT;
    EXEC dbo.myDoubler @in = %s, @out = @out_value OUTPUT;
    SELECT @out_value AS out_value;
    """
    params = (3,)
    crsr.execute(sql, params)
    rows = crsr.fetchall()
    while rows:
        print(rows)
        if crsr.nextset():
            rows = crsr.fetchall()
        else:
            rows = None
    

    Result:

    [('foo',), ('bar',)]
    [(6,)]
    
    0 讨论(0)
  • 2020-12-20 14:33

    It looks like every python dbapi library implemented on top of freetds (pymssql, pyodbc, etc) will not be able to access output parameters when connecting to Microsoft SQL Server 7 SP3 and higher.

    http://www.freetds.org/faq.html#ms.output.parameters

    0 讨论(0)
提交回复
热议问题