Python pyodbc-获取alter语句的结果
我试图通过pyodbc获得一个“alter”语句的结果 我的代码:Python pyodbc-获取alter语句的结果,python,sql-server,pyodbc,Python,Sql Server,Pyodbc,我试图通过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.f
...
connection = pyodbc.connect(connection_string, autocommit=True)
cursor = connection.cursor()
query = "ALTER INDEX index_name ON schema.table REBUILD"
cursor.execute(query)
...
因为这不是一个查询,所以我不能使用curosr.fetchall()
。我怎样才能找到我陈述的结果
某些索引将失败,因为运行脚本的用户没有权限(或由于其他原因),我希望显示服务器抛出的错误消息(光标不会引发异常)。您可以动态执行语句(exec或sp_executesql)在返回成功和错误消息的try/catch块中:
--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
开始尝试
执行官('
--声明在这里
raiserror('xxx',20,1)与日志
');
选择cast(N'success'作为nvarchar(2048))作为errormsg,选择0作为errornumber;
结束尝试
开始捕捉
选择error_message()作为errormsg,error_number()作为errornumber;
端接
去
--交易处理
开始尝试
执行官('
--声明在这里
开始交易
声明@a int;
选择@a=''a''--中止批处理
提交事务--您可以在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
开始尝试
执行官('
--声明在这里
raiserror('xxx',20,1)与日志
');
选择cast(N'success'作为nvarchar(2048))作为errormsg,选择0作为errornumber;
结束尝试
开始捕捉
选择error_message()作为errormsg,error_number()作为errornumber;
端接
去
--交易处理
开始尝试
执行官('
--声明在这里
开始交易
声明@a int;
选择@a=''a''--中止批处理
提交事务--我无法再现您的问题。当我以没有足够权限(即,不是db_ddladmin
)的用户身份尝试运行该命令时,我得到“pyodbc.ProgrammingError:('42000','[42000][Microsoft][ODBC Driver 17 for SQL Server][SQL Server]找不到对象“dbo.MillionRows”“因为它不存在或您没有权限。(1088)(SQLExecDirectW)”。我无法重现您的问题。当我以没有足够权限(即,不是db_ddladmin
)的用户身份尝试运行该命令时,我得到了“pyodbc.ProgrammingError:('42000','[42000][Microsoft][ODBC驱动程序17 for SQL Server][SQL Server]找不到对象“dbo.MillionRows”,因为它不存在或您没有权限。(1088)(SQLExecDirectW)“)。