2

在 SQL 2008 中,我创建了一个表,其中有 2 个 NOT NULL 列。作为标识列的 ID 和作为日期时间数据类型的 DATETIME 列,在默认值或绑定中,我已将其设置为 getdate() 但在执行以下 SP 时出现以下错误。任何建议/方向将不胜感激。谢谢。

当我执行以下 SP 时,出现以下错误:

USE [MachoPOSt]
GO
/****** Object:  StoredProcedure [dbo].[sbssp_InsertTblArchivedMessages]    Script Date: 03/08/2013 

14:16:20 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[sbssp_InsertTblArchivedMessages]
(
      @xmlString varchar(max),
      @fromToMach bit
)
AS
BEGIN
      SET NOCOUNT ON;
      DECLARE @idoc int, @lastId int
      EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlString

      INSERT INTO [dbo].[tblArchivedMessages]
      SELECT * 
      FROM OPENXML(@idoc, '/ATM', 2) WITH [dbo].[tblArchivedMessages]

      EXEC sp_xml_removedocument @idoc

      SET @lastId = (SELECT IDENT_CURRENT('tblArchivedMessages'))

      UPDATE [dbo].[tblArchivedMessages] 
        SET FromToMach = @fromToMach 
        WHERE ID = @lastId
END

这是错误:

消息 515,级别 16,状态 2,过程 sbssp_InsertTblArchivedMessages,第 14 行无法将值 NULL 插入到列 'DateTime',表 'MachoPOST.dbo.tblArchivedMessages';列不允许空值。插入失败。该语句已终止。

4

2 回答 2

2

您需要使用排除datetime列的显式列列表。

只有在default您根本不提供值或使用default关键字时才会生效。您必须NULL从该错误消息中插入。

所以你的查询会是这样的

INSERT INTO [dbo].[tblArchivedMessages]
            (col1,
             col2)
SELECT col1,
       col2
FROM   OPENXML(@idoc, '/ATM', 2) WITH [dbo].[tblArchivedMessages]
于 2013-03-11T12:42:45.987 回答
0

正如 Martin 已经说过的,您必须指定所有列。为了使输入更容易,您可以在 SSMS 中使用拖放:

  1. 将对象资源管理器连接到您的服务器。
  2. 找到数据库和表
  3. 在表格下找到列文件夹
  4. 将整个文件夹拖到打开的查询窗口中

这将自动插入所有列的完整逗号分隔列表。之后,您只需删除不需要的两个。

于 2013-03-11T13:24:52.257 回答