【问题标题】:SQL Server: want to insert data into one column, rest nulls: not letting meSQL Server:想将数据插入一列,其余空值:不让我
【发布时间】:2011-05-13 23:46:06
【问题描述】:

这是我的脚本:

INSERT INTO
 AP09
SELECT
  cds AS CDSCODE
FROM
  P_Schools
WHERE 
  active = 1;

AP09 表中有十列。除了主键 (CDSCODE) 之外的所有键都可以为空。我只想从另一个表中插入 CDSCODE,其余的默认为空。相反,我得到一个错误:

SQL Server Database Error: Insert Error: Column name or number of supplied values does not match table definition.

如果我提供正确数量的空值,则插入工作。但是微软文档说(对于 INSERT 命令):

The Database Engine automatically provides a value for the column if the column: 

--Has an IDENTITY property. The next incremental identity value is used.
--Has a default. The default value for the column is used.
--Has a timestamp data type. The current timestamp value is used.
--Is nullable. A null value is used.
--Is a computed column. The calculated value is used.

有人知道为什么这似乎不像宣传的那样有效吗?这花费了我很多时间,因为我必须为许多桌子这样做! (顺便说一句,这是 SQL Server 2005)

【问题讨论】:

    标签: sql-server sql-server-2005 tsql insert default-value


    【解决方案1】:

    由于表AP09CDSCODE 的列数不同...您需要指定要插入的列。试试这样的 -

    INSERT INTO
     AP09 (Col1)
    
    SELECT
      cds AS CDSCODE 
    FROM
      P_Schools
    WHERE 
      active = 1;
    

    【讨论】:

    • 谢谢,就是这样(我喜欢简单易懂的答案!)我假设通过在 SELECT 语句(cds AS CDSCODE)中给出 AP09 列名,它会弄清楚。 (我主要是程序员,不是 SQL Server 人员)再次感谢!
    【解决方案2】:

    insert提供列列表。

    insert into foo (col1) select ...

    【讨论】:

      【解决方案3】:

      您在选择列表中指定了一列,但未指定要将其加载到表中十列中的哪一列。 SQL 不知道并且不会假设它可以确定将其加载到表中的哪一列——您必须指定要插入到哪一列。 (仅“假设”您提供的列数与要插入的列数一样多。)

      SQL 猜测和错误会比仅仅说“呃,我不知道”要糟糕得多。是的,这似乎是一个简单的选择,但他们必须编写适用于所有可能情况的算法,而这是不可能的。

      【讨论】:

        【解决方案4】:
        INSERT INTO 
         AP09 (YourTargetColumnName)
        SELECT 
          cds AS CDSCODE 
        FROM 
          P_Schools 
        WHERE  
          active = 1;
        

        【讨论】:

        • 如果您发布代码或 XML,在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法高亮!
        【解决方案5】:

        行为和文档是正确的。

        执行insert into foo select att1, att2... 时,您需要在选择语句中提供准确的列数。

        Microsoft 文档中关于“为可空列自动提供值”的声明与下面的插入语句类型有关,其中明确列出了要插入的值的列:

        INSERT INTO Cities (Location)
        VALUES ( 'Chicago' );
        

        在上面的语句中,如果有 9 个其他列接受 null,它们将被隐式填充为 null。

        【讨论】:

        • 如果您发布代码或 XML,在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法高亮!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        相关资源
        最近更新 更多