脚本中IF语句执行逻辑的困惑.

ltolll 2019-01-04 09:58:39
在SQL Server Management Studio中执行脚本的时候会有一个当前数据库的概念, 为了防止误操作我用脚本判断, 当前数据库和待操作数据库是否一致, 如果一致, 则新建一个表, 并插入数据. 脚本代码如下:


-- 待操作数据库
DECLARE @dbName nvarchar(20);
SET @dbName='as2018';

-- 当前数据库
DECLARE @curdbName nvarchar(20);
SET @curdbName=(SELECT DB_NAME());

PRINT(@curdbName)

IF @curdbName=@dbName
Begin

PRINT '已选中目标数据库 ' + @dbName;

/****** Object: Table [dbo].[PriceWay] Script Date: 01/02/2019 08:36:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[PriceWay](
[Id] [smallint] NOT NULL,
[Name] [varchar](20) NULL,
CONSTRAINT [PK_PriceWay] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (1, N'移动平均')
INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (2, N'先进先出')
INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (3, N'后进先出')

End



F5执行脚本, 发现当前数据库即使不是'as2018'时也不提示, 仍然执行IF内的脚本, 且报错:
消息 102,级别 15,状态 1,第 17 行
'ON' 附近有语法错误。
...

不知什么原因.
...全文
310 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dear SQL(燊) 2019-01-07
  • 打赏
  • 举报
回复
引用 9 楼 ltolll 的回复:
[quote=引用 7 楼 Dear SQL 的回复:] [quote=引用 6 楼 ltolll 的回复:] 请问, 如果从数据库导出建表脚本, 可不可以自动加IF, 且不要那些GO. 这样我导出后就可以直接用了.
可以的 [/quote] 奇怪, 我的居然没有图中的选项, 只有这个: [/quote] 我的是sql server 2017,可能是版本问题
ltolll 2019-01-05
  • 打赏
  • 举报
回复
引用 3 楼 吉普赛的歌 的回复:
直接指定当前库就好了, 哪里要那么复杂:
--1. 直接指定当前库为 as2018
USE as2018
GO
--2. 判断 as2018 库中是否有 [dbo].[PriceWay] 表,
-- 如果没有才执行添加表和相应数据
IF NOT EXISTS(SELECT 1 FROM sys.tables AS t WHERE t.[object_id]=OBJECT_ID('[dbo].[PriceWay]'))
BEGIN
CREATE TABLE [dbo].[PriceWay](
[Id] [smallint] NOT NULL,
[Name] [varchar](20) NULL,
CONSTRAINT [PK_PriceWay] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)
) ON [PRIMARY]
INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (1, N'移动平均')
INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (2, N'先进先出')
INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (3, N'后进先出')
END
GO


请问, 如果从数据库导出建表脚本, 可不可以自动加IF, 且不要那些GO.
这样我导出后就可以直接用了.
ltolll 2019-01-05
  • 打赏
  • 举报
回复
谢谢大家, 但是我忘了说, 我这个建表的脚本是从数据库自动导出的, 有几百个表. 手工删除不现实.
看来还是不能这么判断.
ltolll 2019-01-05
  • 打赏
  • 举报
回复
引用 7 楼 Dear SQL 的回复:
[quote=引用 6 楼 ltolll 的回复:]
请问, 如果从数据库导出建表脚本, 可不可以自动加IF, 且不要那些GO.
这样我导出后就可以直接用了.

可以的
[/quote]

奇怪, 我的居然没有图中的选项, 只有这个:
吉普赛的歌 版主 2019-01-05
  • 打赏
  • 举报
回复
引用 6 楼 ltolll 的回复:
[quote=引用 3 楼 吉普赛的歌 的回复:] 直接指定当前库就好了, 哪里要那么复杂:
--1. 直接指定当前库为 as2018
USE as2018
GO
--2. 判断 as2018 库中是否有 [dbo].[PriceWay] 表,
--   如果没有才执行添加表和相应数据
IF NOT EXISTS(SELECT 1 FROM sys.tables AS t WHERE t.[object_id]=OBJECT_ID('[dbo].[PriceWay]'))
BEGIN
	CREATE TABLE [dbo].[PriceWay](
		[Id] [smallint] NOT NULL,
		[Name] [varchar](20) NULL,
		CONSTRAINT [PK_PriceWay] PRIMARY KEY NONCLUSTERED 
		(
		[Id] ASC
		)
	) ON [PRIMARY]
    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (1, N'移动平均')
    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (2, N'先进先出')
    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (3, N'后进先出')
END
GO
请问, 如果从数据库导出建表脚本, 可不可以自动加IF, 且不要那些GO. 这样我导出后就可以直接用了.[/quote] 带 GO 并不怕, 关键是 IF 块里面不能包含 GO 按 #7 那样操作是可以的, 把 “检查是否存在对象”改为 “True”. 另外, 如果希望把表结构脚本和数据一起导出, 可以用 “Navicat”,
Dear SQL(燊) 2019-01-05
  • 打赏
  • 举报
回复
引用 6 楼 ltolll 的回复:
[quote=引用 3 楼 吉普赛的歌 的回复:] 直接指定当前库就好了, 哪里要那么复杂:
--1. 直接指定当前库为 as2018
USE as2018
GO
--2. 判断 as2018 库中是否有 [dbo].[PriceWay] 表,
--   如果没有才执行添加表和相应数据
IF NOT EXISTS(SELECT 1 FROM sys.tables AS t WHERE t.[object_id]=OBJECT_ID('[dbo].[PriceWay]'))
BEGIN
	CREATE TABLE [dbo].[PriceWay](
		[Id] [smallint] NOT NULL,
		[Name] [varchar](20) NULL,
		CONSTRAINT [PK_PriceWay] PRIMARY KEY NONCLUSTERED 
		(
		[Id] ASC
		)
	) ON [PRIMARY]
    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (1, N'移动平均')
    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (2, N'先进先出')
    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (3, N'后进先出')
END
GO
请问, 如果从数据库导出建表脚本, 可不可以自动加IF, 且不要那些GO. 这样我导出后就可以直接用了.[/quote] 可以的
吉普赛的歌 版主 2019-01-04
  • 打赏
  • 举报
回复
直接指定当前库就好了, 哪里要那么复杂:
--1. 直接指定当前库为 as2018
USE as2018
GO
--2. 判断 as2018 库中是否有 [dbo].[PriceWay] 表,
--   如果没有才执行添加表和相应数据
IF NOT EXISTS(SELECT 1 FROM sys.tables AS t WHERE t.[object_id]=OBJECT_ID('[dbo].[PriceWay]'))
BEGIN
	CREATE TABLE [dbo].[PriceWay](
		[Id] [smallint] NOT NULL,
		[Name] [varchar](20) NULL,
		CONSTRAINT [PK_PriceWay] PRIMARY KEY NONCLUSTERED 
		(
		[Id] ASC
		)
	) ON [PRIMARY]
    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (1, N'移动平均')
    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (2, N'先进先出')
    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (3, N'后进先出')
END
GO
Dear SQL(燊) 2019-01-04
  • 打赏
  • 举报
回复
begin end 之前不能用GO GO 不是 Transact-SQL 语句;它是可由 sqlcmd 和 osql 实用工具以及 SQL Server Management Studio 代码编辑器识别的命令。 SQL Server 实用工具将 GO 解释为应该向 SQL Server 实例发送当前批 Transact-SQL 语句的信号。 当前批语句由上一 GO 命令后输入的所有语句组成,如果是第一条 GO 命令,则由即席会话或脚本开始后输入的所有语句组成。 GO 命令和 Transact-SQL 语句不能在同一行中。 但在 GO 命令行中可包含注释。 用户必须遵照使用批处理的规则。 例如,在批处理中的第一条语句后执行任何存储过程必须包含 EXECUTE 关键字。 局部(用户定义)变量的作用域限制在一个批处理中,不可在 GO 命令后引用。
卖水果的net 版主 2019-01-04
  • 打赏
  • 举报
回复

只要这些,其他的全掉

-- 待操作数据库
DECLARE @dbName nvarchar(20);
SET @dbName='as2018';

-- 当前数据库
DECLARE @curdbName nvarchar(20);
SET @curdbName=(SELECT DB_NAME());

PRINT(@curdbName)

IF @curdbName=@dbName
Begin

  PRINT '已选中目标数据库 ' + @dbName;

  
	CREATE TABLE [dbo].[PriceWay](
	  [Id] [smallint] NOT NULL,
	  [Name] [varchar](20) NULL,
	 CONSTRAINT [PK_PriceWay] PRIMARY KEY NONCLUSTERED 
	(
	  [Id] ASC
	)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
	) ON [PRIMARY]
	
	INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (1, N'移动平均')
	INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (2, N'先进先出')
	INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (3, N'后进先出')
	
End

二月十六 版主 2019-01-04
  • 打赏
  • 举报
回复
不是IF判断的问题,是语句本身就有问题,把GO去掉之后就应该没问题了
-- 待操作数据库
DECLARE @dbName nvarchar(20);
SET @dbName='as2018';
 
-- 当前数据库
DECLARE @curdbName nvarchar(20);
SET @curdbName=(SELECT DB_NAME());
 
PRINT(@curdbName)
 
IF @curdbName=@dbName
Begin
 
  PRINT '已选中目标数据库 ' + @dbName;
 


    CREATE TABLE [dbo].[PriceWay](
      [Id] [smallint] NOT NULL,
      [Name] [varchar](20) NULL,
     CONSTRAINT [PK_PriceWay] PRIMARY KEY NONCLUSTERED 
    (
      [Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]


    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (1, N'移动平均')
    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (2, N'先进先出')
    INSERT [dbo].[PriceWay] ([Id], [Name]) VALUES (3, N'后进先出')
     
End

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧