sql-server - SSMS 查询 - 如果数据库不存在,脚本将不会运行

标签 sql-server syntax

我正在尝试做类似的事情:

“如果存在,则使用它。如果不存在,则创建它。” “如果存在,则删除它。如果不存在,则创建它。”

其中一个绝对令人窒息的地方是 use it 命令 - 因为如果它不存在 - 它就会因 use 命令而窒息,即使该命令不会运行。

这里有更多解释:


我有一个 SQL Server 脚本,我在其中创建一个数据库,然后使用该数据库。

脚本不会运行

  • 因为使用数据库命令无效
  • 因为数据库不存在
  • 但它会在第一个命令执行后存在
  • 但这并不重要,因为它现在不存在,因此脚本不会运行。

如何在其中放置尝试使用可能不存在的数据库的代码?

如何将代码放入其中,如果直接运行会导致错误,但除非条件合适,否则不会运行。

请参阅附图。

这是代码,因此您不必键入它...

-- SQL SERVER: We can't run this script because CFPT does not exist.
-- ME: But it WILL exist after the first command runs
-- SQL SERVER: That does not matter - at THIS point in the code... it does not exist... tough luck



-- CREATE THE DATABASE
create database CFPT

-- USE THE DATABASE
USE CFPT

use master
drop database CFPT 

第二个代码片段:

-- SQL SERVER: We can't run this script because CFPT does not exist.
select db_id('CFPT') -- this just lets us see what the IF statement is going to have to deal with

IF db_id('CFPT') is null 
    begin
        print 'DESIRED DB DOES NOT EXIST' 
        return
    end
else
    begin
        use CFPT -- this line of code makes the whole script just not run.
    end;

    -- doesn't want to work - chokes on the use databasename (when the database does not exist)

(编辑1开始//////////////////////////////////////////////////////////////////////////////////////)

通过此编辑添加了第三张图片 - 第二张图片显示 if/then/else 语句不起作用。 第三张图显示数据库 CFPT 不在数据库列表中(图像左侧),并且运行了 select 语句(顶部突出显示的代码)以及该选择的结果(底部红色圆圈)

如何让 if/then/else 语句发挥作用? (因为如果条件不利,那么我们可以说 THEN 将不会运行)

(由于某种原因,红色波浪线没有显示 - 它们应该是,但没有 - 嗯)

(编辑1结束////////////////////////////////////////////////////////////////////////////////////)

(编辑2开始//////////////////////////////////////////////////////////////////////////////////////)

关于这个问题 - 尝试隔离通常会失败但不会尝试执行的命令,除非条件恰到好处......(参见下面的第四张图)我正在隔离一些命令使用 IF 语句 (IF 1=2),但即使条件为 false,SQL Server 也会进入该 IF 语句。这是为什么?

(编辑2结束////////////////////////////////////////////////////////////////////////////////////)

enter image description here

enter image description here

enter image description here enter image description here

最佳答案

试试这个...

-- CREATE THE DATABASE
create database CFPT
GO
-- USE THE DATABASE
USE CFPT

use master
drop database CFPT 

GO命令是一个批处理终止符,它将创建数据库的命令与使用数据库的命令分开。

参见https://msdn.microsoft.com/en-us/library/ms188037.aspx

What is the use of GO in SQL Server Management Studio & Transact SQL?

关于sql-server - SSMS 查询 - 如果数据库不存在,脚本将不会运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39276361/

相关文章:

sql - SQL Server 中是否需要主键?

sql-server - Visual Studio 与 SQL Server Management Studio - 您的选择

sql-server - 主键的 Sql 数据类型 - SQL Server?

sql - 我如何将这两者结合在一起? Varchar guid 和 guid 类型都是主键

c++ - 初始化列表后的大括号

syntax - 某些 D 属性上的 "@"前缀的含义是什么?

syntax - 原生属性可以用作参数中的绑定(bind)目标吗?

bash - 变量引用是否应该在算术 for 循环(算术上下文)中以 $ 为前缀?

ios - Swift 3 代码中的这些小方 block 符号是什么?

C# 直接从 SqlDataReader 填充字典