SQL Server 2008 DATETIME列数据类型不默认为getdate()的当前日期

时间:2013-03-11 12:35:19

标签: sql-server sql-server-2008

在SQL 2008中,我创建了一个表,其中我有2个NOT NULL列。 ID是一个标识列,DATETIME列是一个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

这是错误:

  

Msg 515,Level 16,State 2,Procedure   第14行的sbssp_InsertTblArchivedMessages无法插入   值为NULL的'DateTime'列表   'MachoPOSt.dbo.tblArchivedMessages';专栏没有   允许空值。 INSERT失败。声明已经终止。

2 个答案:

答案 0 :(得分:2)

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

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

所以你的查询就像

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

答案 1 :(得分:0)

正如Martin所说,你必须指定所有列。为了使打字更容易,您可以使用SSMS中的拖放功能:

  1. 将对象资源管理器连接到您的服务器。
  2. 找到数据库和表格
  3. 表格下的
  4. 找到列文件夹
  5. 将整个文件夹拖到打开的查询窗口
  6. 这将自动插入所有列的完整逗号分隔列表。之后你只需删除你不需要的两个。