在事务下执行时,Sql抛出错误

时间:2009-05-26 13:20:24

标签: .net sql sql-server

我正在尝试在事务下执行以下语法,但它会抛出错误: -

这是我在交易下执行的脚本: -

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
-- full text search is installed. Run the necessary procedures
BEGIN
    declare @dbName nvarchar(128)
    select @dbName = DB_Name()
    exec('ALTER DATABASE [' + @dbName + '] SET RECOVERY SIMPLE')

    if(0 = DATABASEPROPERTY(DB_Name(),'IsFulltextEnabled'))
    BEGIN
        -- Full text is installed but not enabled on the Database. Enable that
        EXEC sp_fulltext_database 'enable'  
    END

    -- Check if there are current tables in full text search. If yes, remove them
    if(1 = INDEXPROPERTY(Object_id('Blog'),'PK_Blog','IsFulltextKey'))
    BEGIN
        -- Drop the full text index
        EXEC sp_fulltext_table 'Blog','drop'
    END
END

我收到以下错误: -

多语句事务中不允许使用ALTER DATABASE语句。 无法在事务中执行过程'sys.sp_fulltext_table'。 无法在事务中执行过程'sys.sp_fulltext_table'。 无法在事务中执行过程'sys.sp_fulltext_table'。

你们有什么想法?

编辑: -          我想知道有没有办法做到这一点。我正在尝试更改数据库中列的数据类型,并为全文搜索启用它们,因此我希望以某种方式完成上述操作。 :(

3 个答案:

答案 0 :(得分:3)

你在问什么?

您收到的错误信息正好解释了问题所在。您无法在交易下执行该SPROC。

答案 1 :(得分:2)

这里的问题是,像Alter Database这样的大多数数据定义语言语句(DDL)在执行时会发出隐式提交。 TSQL代码试图通过告诉您“您不能这样做”来保护您免受意外结果的影响。

答案 2 :(得分:0)

您可以尝试滚动自己的交易。基本上,在每个步骤捕获已完成的操作,如果有任何失败,请手动撤消到故障点的步骤。但这很危险,因为如果发生灾难性故障,那么你可能无法回滚所有内容,而且总有可能错过某种组合。