python - pyodbc - 获取 alter 语句的结果
问题描述
我正在尝试获取我正在通过 pyodbc 运行的“alter”语句的结果。
我的代码:
...
connection = pyodbc.connect(connection_string, autocommit=True)
cursor = connection.cursor()
query = "ALTER INDEX index_name ON schema.table REBUILD"
cursor.execute(query)
...
由于这不是查询,我不能使用curosr.fetchall()
. 我怎样才能找到我的陈述的结果?
某些索引会失败,因为运行脚本的用户没有权限(或由于其他原因),我想显示服务器抛出的错误消息(光标没有引发异常)。
解决方案
您可以在 try/catch 块中动态执行语句(exec 或 sp_executesql),该块返回成功和错误消息:
--exec
begin try
exec('
--statement goes here
ALTER INDEX index_name ON schema.table REBUILD
');
select cast(N'success' as nvarchar(2048)) as errormsg, 0 as errornumber;
end try
begin catch
select error_message() as errormsg, error_number() as errornumber;
--..maybe some transaction handling...for statements with transactions..
--if @@trancount > 0
--begin
-- rollback transaction
--end
end catch
--sp_executesql
declare @sql nvarchar(max) = 'ALTER INDEX index_name ON schema.table REBUILD';
begin try
exec sp_executesql @stmt = @sql;
select cast(N'success' as nvarchar(2048)) as errormsg, 0 as errornumber;
end try
begin catch
select error_message() as errormsg, error_number() as errornumber;
end catch
Try/catch 不是完全优雅的,一些错误会中止连接(取决于错误的严重程度),调用者应该有某种异常处理:
begin try
exec ('
--statement goes here
raiserror(''xxx'', 20, 1) with log
');
select cast(N'success' as nvarchar(2048)) as errormsg, 0 as errornumber;
end try
begin catch
select error_message() as errormsg, error_number() as errornumber;
end catch
go
--transaction handling
begin try
exec ('
--statement goes here
begin transaction
declare @a int;
select @a = ''A'' --aborts the batch
commit transaction --<-- this is not executed
');
select cast(N'success' as nvarchar(2048)) as errormsg, 0 as errornumber;
end try
begin catch
select error_message() as errormsg, error_number() as errornumber;
end catch
--error here: Uncommittable transaction....
go
begin try
exec ('
--statement goes here
begin transaction
declare @a int;
select @a = ''A'' --aborts the batch
commit transaction
');
select cast(N'success' as nvarchar(2048)) as errormsg, 0 as errornumber;
end try
begin catch
select error_message() as errormsg, error_number() as errornumber;
if @@trancount > 0
begin
rollback transaction;
end
end catch
推荐阅读
- javascript - Bootstrap 4 - 附加侧边栏时无法保持相同的宽度
- sql - 需要为 SQL Server 创建函数
- c# - C# 无法从 Excel 文件中获取完整的数据表
- java - 框架的应用
- c# - 从 C# 中的特定标题名称读取 csv 文件
- c# - NCalc Evaluate() 给出错误答案
- windows - 从 Windows 7 通过 USB 连接到 Orbbec Persee 时出现问题
- java - JavaFX - 如何在可编辑的 TableView 中检查用户输入
- crm - Odoo vs 自制 cakephp 开发
- javascript - 创建自定义搜索管道以动态过滤结果后,我仍然失败:解析错误:找不到管道“过滤器”