2016 обновление (поддержка callproc в pymssql 2.x)
pymssql v2.x предлагает ограниченную поддержку callproc
. Он поддерживает параметры OUTPUT с использованием синтаксиса параметра pymssql.output()
. Однако обратите внимание, что параметры OUTPUT могут быть получены только с помощью callproc
, если хранимая процедура не также возвращает набор результатов. Эта проблема обсуждается на GitHub здесь .
Для хранимых процедур, которые не возвращают набор результатов
С учетом хранимой процедуры T-SQL
CREATE PROCEDURE [dbo].[myDoubler]
@in int = 0,
@out int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @out = @in * 2;
END
код Питона
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]
).
Для хранимых процедур, которые возвращают набор результатов
Если хранимая процедура возвращает один или несколько наборов результатов , а также возвращает выходные параметры, нам нужно использовать блок анонимного кода для получения значений выходных параметров:
Хранимая процедура:
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,)]