【问题标题】:How to use USE DBName after CREATE DATABASE DBName in one script in Transact-SQL?如何在 Transact-SQL 的一个脚本中在 CREATE DATABASE DBName 之后使用 USE DBName?
【发布时间】:2021-10-21 08:37:01
【问题描述】:

我正在尝试在 T-SQL 中编写这样的代码

BEGIN TRANSACTION

CREATE DATABASE DBName

USE DBName

BEGIN TRY
    --Some sample query that could go wrong
END TRY
BEGIN CATCH
    ROLLBACK
END CATCH

我遇到了错误

DBName 数据库不存在

这个答案建议使用 GO 关键字 (Click Here)

我遇到了错误

“GO”附近的语法错误

这个答案告诉我们 GO 不能在 T-SQL 中使用 (Click Here)

我正在使用 C# OleDBConnection 来执行 SQL 代码

如果我先单独执行 CREATE DATABASE 然后在单独的文件中执行 USE DBName 就可以了。

但在这种情况下,ROLLBACK 不会回滚数据库创建命令,我将得到一个空白数据库。这就是为什么,我需要在同一个文件中包含 CREATE DATABASE 和 USE DATABASE 命令

如何在 T-SQL 中使用相当于 GO 关键字的东西?

【问题讨论】:

  • 您遇到的问题是您尝试在切换上下文的同一批次中创建数据库。因此,该语句在解析时失败,数据库DBName 不存在。在 IDE 中,您可以使用 GO 分隔批次,但如果您不使用 IDE,则需要以编程方式在单独的批次中创建数据库。
  • @Larnu 在这种情况下,如何执行 ROLLBACK 以使数据库也被删除?当我现在使用它时,只有该批次的命令正在回滚
  • 您需要在您的应用程序中捕获错误,并将问题发送到DROP
  • “我怎样才能在 T-SQL 中使用相当于 GO 关键字的东西?” GO 也不是 T-SQL 关键字。这在documentation 中有非常明确的说明。
  • 这里的首要目标是什么?为什么还需要删除数据库?如果您多次重新运行批处理,那么如果数据库不存在或有单独的清理过程,则只需创建数据库。

标签: c# sql-server tsql rollback oledbconnection


【解决方案1】:

自己处理回滚。

  • 先批量创建数据库
  • 下次使用另一个批次的数据库
  • 如果您决定不再需要该数据库
    • 删除数据库

【讨论】:

    猜你喜欢
    • 2017-04-28
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多