Python 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

我试图通过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()
。我怎样才能找到我陈述的结果


某些索引将失败,因为运行脚本的用户没有权限(或由于其他原因),我希望显示服务器抛出的错误消息(光标不会引发异常)。

您可以动态执行语句(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)“)。