2016 更新 (pymssql 2.x での callproc サポート)
pymssql v2.x は、callproc
. pymssql.output()
パラメーター構文を使用して OUTPUT パラメーターをサポートします。ただし、callproc
ストアド プロシージャが結果セットも返さない場合にのみ、OUTPUT パラメータを取得できることに注意してください。この問題については、こちらの GitHub で議論されています。
結果セットを返さないストアド プロシージャの場合
与えられた T-SQL ストアド プロシージャ
CREATE PROCEDURE [dbo].[myDoubler]
@in int = 0,
@out int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @out = @in * 2;
END
Python コード
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()
次の出力を生成します
(3, 6)
callproc
は、ストアド プロシージャによって割り当てられた OUTPUT パラメータ値を含むパラメータ タプルを返すことに注意してください (foo[1]
この場合)。
結果セットを返すストアド プロシージャの場合
ストアド プロシージャが 1 つ以上の結果セットを返し、出力パラメーターも返す場合、匿名コード ブロックを使用して出力パラメーター値を取得する必要があります。
ストアド プロシージャ:
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 コード:
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
結果:
[('foo',), ('bar',)]
[(6,)]