2

SQL 2008 では、2 つの NOT NULL 列があるテーブルを作成しました。ID 列である 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' に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました。

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

マーティンがすでに言ったように、すべての列を指定する必要があります。入力を少し簡単にするために、SSMS でドラッグ & ドロップを使用できます。

  1. オブジェクト エクスプローラーをサーバーに接続します。
  2. データベースとテーブルを見つける
  3. テーブルの下で、列フォルダーを見つけます
  4. フォルダ全体を開いているクエリ ウィンドウにドラッグします。

これにより、すべての列の完全なコンマ区切りリストが自動的に挿入されます。その後、不要な 2 つを削除するだけです。

于 2013-03-11T13:24:52.257 に答える