如何在 Transact-SQL 的一个脚本中在 CREATE DATABASE DBName 之后使用 USE DBName?

Posted

技术标签:

【中文标题】如何在 Transact-SQL 的一个脚本中在 CREATE DATABASE DBName 之后使用 USE DBName?【英文标题】:How to use USE DBName after CREATE DATABASE DBName in one script in Transact-SQL? 【发布时间】: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 中有非常明确的说明。 这里的首要目标是什么?为什么还需要删除数据库?如果您多次重新运行批处理,那么如果数据库不存在或有单独的清理过程,则只需创建数据库。 【参考方案1】:

自己处理回滚。

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

【讨论】:

以上是关于如何在 Transact-SQL 的一个脚本中在 CREATE DATABASE DBName 之后使用 USE DBName?的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server数据库常用Transact-SQL脚本

如何在 PHP 中在浏览器中打开文件之前验证用户 IP? [关闭]

如何在 Python 中在终端密码提示中输入密码

如何使用screen在ssh会话中在后台发出命令

SqlServer2008R2使用SQLCMD执行多个脚本

如何根据 Transact-sql 中的 group-by 子句中的项目设置类别?