簡體   English   中英

有沒有辦法將存儲過程 Return_Value 返回給執行它的 python 腳本?

[英]Is there a way to return a Stored Procedure Return_Value to the python script executing it?

我正在編寫一個 python 腳本,它應該更新日志表並通知我。 該腳本的一部分是執行 SQL 服務器存儲過程。 我得到一個 email 告訴我腳本的狀態以及存儲過程的狀態,具體取決於返回值。 但我似乎無法讓我的存儲過程返回 Return_Value。 該腳本執行存儲過程但未收到任何反饋。

我試過使用 SQLAlchemy:

resulta = engine.execute(text(""" DECLARE @return int EXEC @return = [MYPROC] '{User}', '{Status}' 
                         SELECT 'RETURN' = @return """.format(User = curruser, Status = 'Pass')).execution_options(autocommit=True))

我的結果返回: <sqlalchemy.engine.cursor.LegacyCursorResult object at 0xXXXXXXXXXX>

我也嘗試過使用游標:

resultb = cur.execute(""" DECLARE @return int EXEC @return = [MYPROC] '{User}', '{Status}' 
                         SELECT 'RETURN' = @return """.format(User = curruser, Status = 'Pass'))

我的結果返回: NoneType object

我也嘗試用 RETURN 替換 SELECT 但這似乎會導致更多問題。 請幫忙。

您當然可以使用 pyodbc Cursors 來做到這一點。 您需要事先知道您正在執行的存儲過程返回了多少結果集,以便帶有返回代碼的結果集位於您期望的位置。

下面的示例使用@dbname參數執行sp_helpdb ,它從存儲過程本身返回兩個結果集,第三個結果集包含返回代碼...

import pyodbc

server = 'tcp:127.0.0.1,1433' 
database = 'master' 
username = 'sa' 
password = 'StrongPassw0rd' 

connStr = 'DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password
cnxn = pyodbc.connect(connStr)
cursor = cnxn.cursor()

params = ( ('tempdb') )
result = cursor.execute("""
    declare @ReturnCode int;
    exec @ReturnCode = sp_helpdb @dbname = ?;
    select @ReturnCode as ReturnCode;
""", params)

# 1st result set from stored procedure...
databaseColumns = tuple([column[0] for column in result.description])
databaseRows = result.fetchall()
print(databaseColumns)
print(databaseRows)
print()

result.nextset()

# 2nd result set from stored procedure...
logicalFileColumns = tuple([column[0] for column in result.description])
logicalFileRows = result.fetchall()
print(logicalFileColumns)
print(logicalFileRows)
print()

result.nextset()

# 3rd result set for return code...
returnCodeColumns = tuple([column[0] for column in result.description])
returnCodeRows = result.fetchall()
print(returnCodeColumns)
print(returnCodeRows)
print()

將以下內容輸出到控制台...

('name', 'db_size', 'owner', 'dbid', 'created', 'status', 'compatibility_level')
[
  ('tempdb', '     24.00 MB', 'sa', 2, 'Apr 29 2022', 'Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=SIMPLE, Version=904, Collation=SQL_Latin1_General_CP1_CI_AS, SQLSortOrder=52, IsAutoCreateStatistics, IsAutoUpdateStatistics', 150)
]

('name', 'fileid', 'filename', 'filegroup', 'size', 'maxsize', 'growth', 'usage')
[
  ('tempdev', 1, '/var/opt/mssql/data/tempdb.mdf', 'PRIMARY', '8192 KB', 'Unlimited', '65536 KB', 'data only'),
  ('templog', 2, '/var/opt/mssql/data/templog.ldf', None, '8192 KB', 'Unlimited', '65536 KB', 'log only'),
  ('tempdev2', 3, '/var/opt/mssql/data/tempdb2.ndf', 'PRIMARY', '8192 KB', 'Unlimited', '65536 KB', 'data only')
]

('ReturnCode',)
[(0, )]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM