当前位置: 首页 > 面试题库 >

SQL IF语句被忽略

商鸿哲
2023-03-14
问题内容

我的脚本很长,我希望能够在需要时仅运行整个文件,而不用担心它的某些部分是否已经运行。但是下面的脚本给我带来了问题。由于某些原因,即使列’EntityID’和’EntityType’不存在,它也将通过IF语句,在这种情况下,它不应通过IF语句。有人可以告诉我怎么了吗?

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Notes' AND COLUMN_NAME IN ('EntityId', 'EntityType'))
BEGIN
    BEGIN TRANSACTION
        --Delete notes where EntityType and EntityID are both NULL
        DELETE FROM [dbo].[Notes]
        WHERE [EntityId] = NULL 
        AND [EntityType] = NULL
        --Delete notes where the corresponding contact or account has been deleted.
        OR [ID] IN (9788, 10684, 10393, 10718, 10719)

        --Populate new columns with all existing data
        UPDATE [dbo].[Notes]
        SET [AccountId] = [EntityId]
        WHERE [EntityType] = 1

        UPDATE [dbo].[Notes]
        SET [ContactId] = [EntityId]
        WHERE [EntityType] = 2

        --Delete EntityId and EntityType columns from the Notes table
        ALTER TABLE [dbo].[Notes]
        DROP COLUMN [EntityId], [EntityType]
    COMMIT
END
GO

表的脚本

CREATE TABLE [dbo].[Notes](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [AnnotationID] [uniqueidentifier] NULL,
    [CreatedBy] [int] NULL,
    [CreatedDate] [datetime] NULL,
    [NoteText] [ntext] NULL,
    [OriginalAnnotationID] [uniqueidentifier] NULL,
    [Active] [bit] NULL,
    [ContactId] [int] NULL,
    [AccountId] [int] NULL,
 CONSTRAINT [PK_Notes] PRIMARY KEY CLUSTERED 
(
    [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] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[Notes]  WITH CHECK ADD  CONSTRAINT [FK_Account_ID] FOREIGN KEY([AccountId])
REFERENCES [dbo].[Account] ([ID])
GO

ALTER TABLE [dbo].[Notes] CHECK CONSTRAINT [FK_Account_ID]
GO

ALTER TABLE [dbo].[Notes]  WITH CHECK ADD  CONSTRAINT [FK_ContactId_ID] FOREIGN KEY([ContactId])
REFERENCES [dbo].[Contact] ([ID])
GO

ALTER TABLE [dbo].[Notes] CHECK CONSTRAINT [FK_ContactId_ID]
GO

错误:

Msg 207, Level 16, State 1, Line 6
Invalid column name 'EntityId'.
Msg 207, Level 16, State 1, Line 7
Invalid column name 'EntityType'.
Msg 207, Level 16, State 1, Line 12
Invalid column name 'EntityType'.
Msg 207, Level 16, State 1, Line 16
Invalid column name 'EntityType'.

问题答案:

马丁绝对是有东西的。里面的东西IF是由在分析时解析器处理,而忽略你是否IF会做成。这是您不能执行的相同原因:

IF 1 = 1
  CREATE TABLE #x(a INT);
ELSE
  CREATE TABLE #x(b INT);

一种解决方法是使用动态SQL:

IF EXISTS ...
BEGIN
  BEGIN TRANSACTION;

  DECLARE @sql NVARCHAR(MAX);

  SET @sql = N'
        DELETE FROM [dbo].[Notes]
        WHERE [EntityId] IS NULL 
        AND [EntityType] IS NULL
        --Delete notes where the corresponding contact or account has been deleted.
        OR [ID] IN (9788, 10684, 10393, 10718, 10719)

        --Populate new columns with all existing data
        UPDATE [dbo].[Notes]
        SET [AccountId] = [EntityId]
        WHERE [EntityType] = 1

        UPDATE [dbo].[Notes]
        SET [ContactId] = [EntityId]
        WHERE [EntityType] = 2

        --Delete EntityId and EntityType columns from the Notes table
        ALTER TABLE [dbo].[Notes]
        DROP COLUMN [EntityId], [EntityType]';

    EXEC sp_executesql @sql;

    COMMIT TRANSACTION;
END

但是您仍然应该确保 列都在那里。



 类似资料:
  • 问题内容: 我们的许多模块都始于: …这是整个文件中唯一的Pyflakes警告: 我如何让Pyflakes忽略这一点? (通常我会去阅读文档,但是链接断开了。如果没有人回答,我只会阅读源代码。) 问题答案: 如果您可以改用flake8-包裹pyflakes和pep8 checker-则以 (其中的空间显著-代码的结束和2米之间的空间之一,它和之间,文本)将告诉检查忽略该行的任何错误。

  • 问题内容: 该查询允许对结果进行过滤,而不是对我将如何更新的结果进行过滤,因此它仅严格显示大学= 2时的结果 我将全文搜索与LIKE结合使用的原因是,由于全文搜索具有的最小字母数,并且由于我处于共享主机计划中,因此无法修改设置。结果,我将全文和LIKE结合在一起以适应 问题答案: 修正括号 具有比更高的优先级,因此只能与结合使用,而不能与测试结合使用。

  • 我只是在Java中测试一些并发编程。基本上,我有一个类(Light),它是一种有限状态机,并根据命令改变其状态。这就是我正在尝试的:灯处于开启状态,我向这个类的线程发送一个命令来改变关闭状态。但是我在执行过程中遇到了一个问题。 首先,让我向大家介绍一下: 输出显示我处于ON状态,而我应该处于OFF状态。 在第二次运行时,在放入一条指令(< code>System.out.println或其他指令后

  • 问题内容: 我正在使用Business Intelligence 2008在SSRS中创建一个表。我有一个日期(作为字符串)作为表中使用的值之一。此值可以包含表示日期的字符串,也可以为空白。如果它有一个值,我想用另一种方式格式化该值。现在,我对显示它的单元格具有以下表达式: 如果该字段具有值,则可以完美地工作。但是,当该字段为空白时,该单元格将填充。如果我只有该功能,这将是有意义的,但似乎应该防止

  • 我是数据库领域的初学者,我的任务是编写一个在嵌套表中添加记录的过程,这是。我写的sql文件: 当我跑步的时候。sql文件我收到一条警告消息(使用编译错误创建的过程)当我运行时(显示错误过程TT1_ajute_PERSON_DANS_ALBUM;)我得到错误(忽略语句)和(缺少表达式) 我已经在谷歌上搜索过这个问题,大多数情况下都是因为打字错误,但我不认为这是我的情况!以下是表(TT1_相册)和(T

  • 我的文件似乎被Git忽略了-文件是否已损坏?Git期望哪种文件格式、区域设置或区域性? 我的: 的输出: 我希望和不出现在“未跟踪文件”列表中。 我应该从哪里开始寻找解决这个问题?