在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失败。声明已经终止。
答案 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中的拖放功能:
这将自动插入所有列的完整逗号分隔列表。之后你只需删除你不需要的两个。