【问题标题】:Why is SQL executing both lines为什么 SQL 会同时执行两行
【发布时间】:2017-06-12 19:17:49
【问题描述】:

我正在运行一些动态 SQL 来查找一些表的名称。一旦我有了这些表,我就会运行一些代码来将内容插入到一个临时表中。我遇到的问题是某些表有一列 COL6。在我的临时表中,我有一个占位符,用于保存从 col1 到 col6 的所有值。但如果它只有 5 我将只插入 5 列。

不幸的是,我的代码在这两种情况下都运行。我该如何纠正这个问题?

IF EXISTS(SELECT * FROM information_schema.COLUMNS 
WHERE  TABLE_NAME =     'MY_TABLE' AND COLUMN_NAME = 'COL6')
 BEGIN
  --if my table has col 6 I want this to run
INSERT INTO TMP_TABLE (COL1,COL2,COL3,COL4,COL5,COL6)
SELECT COL1,COL2,COL3,COL4,COL5,COL6 FROM MY_TABLE
END
 ELSE 
 BEGIN
   --If it does not I want this to run
INSERT INTO TMP_TABLE (COL1,COL2,COL3,COL4,COL5)
SELECT COL1,COL2,COL3,COL4, COL5 FROM MY_TABLE
END

在此先感谢

【问题讨论】:

  • @a_horse_with_no_name 我猜我的 sql 因为他正在使用 information_schema
  • 据我了解,您要插入取决于您有多少列,如果您有 3 列,您想插入 3 列对吗?
  • 正确.....它告诉我第 6 列不存在。但是如果 col 6 不存在我不想运行该插入我想运行 5 列的插入
  • 我用的是MS sql server
  • 如果这个问题包含了您在任何地方都忘记提及的错误消息,那么这个问题将会得到显着改善,这实际上并不表示两条线都在执行 -这是您基于错误消息的假设,但实际上并非如此。

标签: sql-server tsql cursor dynamic-sql


【解决方案1】:

你误解了一些事情。代码根本没有运行。当 COL6 不存在时,您会收到 compile 错误。作为一个类比,考虑一个 C# 函数,它首先通过反射检查一个类是否具有某个成员函数,然后尝试直接在该类型的变量上调用该函数 - 如果该类没有那个函数,你会得到一个编译器错误。

因此,您必须避免编译依赖于特定元数据查找的代码,直到获得该查找的结果:

IF EXISTS(SELECT * FROM information_schema.COLUMNS 
WHERE  TABLE_NAME =     'MY_TABLE' AND COLUMN_NAME = 'COL6')
BEGIN
  --if my table has col 6 I want this to run
   EXEC('INSERT INTO TMP_TABLE (COL1,COL2,COL3,COL4,COL5,COL6)
         SELECT COL1,COL2,COL3,COL4,COL5,COL6 FROM MY_TABLE')
END
ELSE 
BEGIN
   --If it does not I want this to run
    EXEC('INSERT INTO TMP_TABLE (COL1,COL2,COL3,COL4,COL5)
          SELECT COL1,COL2,COL3,COL4, COL5 FROM MY_TABLE')
END

(您可能不必类似地保护ELSE 部分,因为它可以编译任何一种方式,但我通常会这样做只是为了对称)

【讨论】:

    【解决方案2】:

    即使你只想插入5列,你选择6。在“else”中选择5列应该没问题

    【讨论】:

    • 请举个例子
    • 不幸的是这没有发生......我调整了我的 sn-p 并添加了 cmets
    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2021-09-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多