【问题标题】:pyodbc - get results of alter statementpyodbc - 获取 alter 语句的结果
【发布时间】:2023-03-10 07:05:02
【问题描述】:

我正在尝试获取我正在通过 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()。如何找到我的陈述结果?

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

【问题讨论】:

  • 我无法重现您的问题。当我尝试以没有足够权限的用户身份运行该命令时(即不是db_ddladmin),我得到“pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL服务器]找不到对象“dbo.MillionRows”,因为它不存在或您没有权限。(1088) (SQLExecDirectW)')"。

标签: python sql-server pyodbc


【解决方案1】:

您可以在 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

【讨论】:

    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2015-10-29
    相关资源
    最近更新 更多