如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章