2

次のストアド プロシージャに xmlString 値とビット値 1 を挿入しようとしています。

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

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

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

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

SPを実行するときは、次のようにしています。

EXEC dbo.sbssp_InsertArchivedMessages '<MACH><B000>StringVal</B000><B002>StringVal</B002><B003>StringVal</B003><B004>StringVal</B004><B007>StringVal</B007><B011>StringVal</B011><B012>StringVal</B012><B013>StringVal</B013><B015>StringVal</B015><B018>StringVal</B018><B028>StringVal</B028><B032>StringVal</B032><B037>StringVal</B037><B039>StringVal</B039><B041>StringVal</B041><B043>StringVal</B043><B048>StringVal</B048><B049>StringVal</B049><B058>StringVal</B058><B061>StringVal</B061><B063>StringVal</B063><B127>StringVal</B127></MACH>', 1

これは私が得ているエラーです:

メッセージ 515、レベル 16、状態 2、手順 sbssp_InsertArchivedMessages、行 13
値 NULL を列 'FromToMach'、テーブル 'MachoPOSt.dbo.ArchivedMessages' に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました。

私が間違っていることについて何か提案はありますか?また、各値の前に @variable 名を付けましたが、それでも同じエラーが発生します。

ヘルプ/指示をいただければ幸いです。ありがとう。

4

2 に答える 2

2

列の 1 つにデータを入力していません

テーブルがどのように見えるかわかりませんが、問題はこれです

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

問題は FromToATM 列に渡す値です

于 2013-03-08T20:38:34.140 に答える
0

@fromToMatch は、sp_xml_preparedocument ストアド プロシージャの最後のパラメーターとして指定しないでください。

このパラメーターは xPath 名前空間用であり、サンプル XML には含まれていないようです。したがって、この状況ではこのパラメーターに必要な値はありません。

また、XML は CASE SensiTive であるため、OPENXML で「Mach」を「MACH」に変更します。

関連するテーブルの DDL がないと、システムで正確にシミュレートできませんが、これを試してみてください。

EXEC sp_xml_preparedocument 
    @idoc OUTPUT, 
    @xmlString;

INSERT INTO [dbo].[tblArchivedMessages]
    --(really should list columns here)
SELECT 
    --really should list columns here
    --instead of 
    *
FROM OPENXML(@idoc, '/MACH', 2) 
    WITH [dbo].[tblArchivedMessages];

SET @lastId = SCOPE_IDENTITY();

EXEC sp_xml_removedocument 
   @idoc;   --never a bad idea to clean up!

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

試してみてください。動作するかどうかを確認してください。そうでない場合は、「tblArchivedMessages」テーブルのスクリプトを作成し、DDL を投稿します。

いずれにせよ、私たちはそれを機能させます!

乾杯!

(ちなみに、このコードは私のマシンでそのまま動作するようです):

DECLARE 
    @idoc int, 
    @lastId int, 
    @xmlString varchar(max),
    @fromToMach bit


SET @xmlString = 
   '<MACH><B000>StringVal</B000><B002>StringVal</B002><B003>StringVal</B003><B004>StringVal</B004><B007>StringVal</B007><B011>StringVal</B011><B012>StringVal</B012><B013>StringVal</B013><B015>StringVal</B015><B018>StringVal</B018><B028>StringVal</B028><B032>StringVal</B032><B037>StringVal</B037><B039>StringVal</B039><B041>StringVal</B041><B043>StringVal</B043><B048>StringVal</B048><B049>StringVal</B049><B058>StringVal</B058><B061>StringVal</B061><B063>StringVal</B063><B127>StringVal</B127></MACH>';

SET @fromToMach = 1;

EXEC sp_xml_preparedocument 
    @idoc OUTPUT, 
    @xmlString;


SELECT 
    --really should list columns here
    --instead of 
    *
FROM OPENXML(@idoc, '/MACH', 2) 
        WITH
            (
                B000 VARCHAR(100),
                B001 VARCHAR(100), 
                B002 VARCHAR(100), 
                B003 VARCHAR(100), 
                B004 VARCHAR(100), 
                B005 VARCHAR(100), 
                B006 VARCHAR(100), 
                B007 VARCHAR(100), 
                B008 VARCHAR(100), 
                B009 VARCHAR(100), 
                B010 VARCHAR(100), 
                B011 VARCHAR(100), 
                B012 VARCHAR(100), 
                B013 VARCHAR(100), 
                B014 VARCHAR(100), 
                B015 VARCHAR(100), 
                B016 VARCHAR(100), 
                B017 VARCHAR(100), 
                B018 VARCHAR(100), 
                B019 VARCHAR(100), 
                B020 VARCHAR(100), 
                B021 VARCHAR(100), 
                B022 VARCHAR(100), 
                B023 VARCHAR(100), 
                B024 VARCHAR(100), 
                B025 VARCHAR(100), 
                B026 VARCHAR(100), 
                B027 VARCHAR(100), 
                B028 VARCHAR(100), 
                B029 VARCHAR(100), 
                B030 VARCHAR(100), 
                B031 VARCHAR(100), 
                B032 VARCHAR(100), 
                B033 VARCHAR(100), 
                B034 VARCHAR(100), 
                B035 VARCHAR(100), 
                B036 VARCHAR(100), 
                B037 VARCHAR(100), 
                B038 VARCHAR(100), 
                B039 VARCHAR(100), 
                B040 VARCHAR(100), 
                B041 VARCHAR(100), 
                B042 VARCHAR(100), 
                B043 VARCHAR(100), 
                B044 VARCHAR(100), 
                B045 VARCHAR(100), 
                B046 VARCHAR(100), 
                B047 VARCHAR(100), 
                B048 VARCHAR(100), 
                B049 VARCHAR(100), 
                B050 VARCHAR(100), 
                B051 VARCHAR(100), 
                B052 VARCHAR(100), 
                B053 VARCHAR(100), 
                B054 VARCHAR(100), 
                B055 VARCHAR(100), 
                B056 VARCHAR(100), 
                B057 VARCHAR(100), 
                B058 VARCHAR(100), 
                B059 VARCHAR(100), 
                B060 VARCHAR(100), 
                B061 VARCHAR(100), 
                B062 VARCHAR(100), 
                B063 VARCHAR(100), 
                B064 VARCHAR(100), 
                B065 VARCHAR(100), 
                B066 VARCHAR(100), 
                B067 VARCHAR(100), 
                B068 VARCHAR(100), 
                B069 VARCHAR(100), 
                B070 VARCHAR(100), 
                B071 VARCHAR(100), 
                B072 VARCHAR(100), 
                B073 VARCHAR(100), 
                B074 VARCHAR(100), 
                B075 VARCHAR(100), 
                B076 VARCHAR(100), 
                B077 VARCHAR(100), 
                B078 VARCHAR(100), 
                B079 VARCHAR(100), 
                B080 VARCHAR(100), 
                B081 VARCHAR(100), 
                B082 VARCHAR(100), 
                B083 VARCHAR(100), 
                B084 VARCHAR(100), 
                B085 VARCHAR(100), 
                B086 VARCHAR(100), 
                B087 VARCHAR(100), 
                B088 VARCHAR(100), 
                B089 VARCHAR(100), 
                B090 VARCHAR(100), 
                B091 VARCHAR(100), 
                B092 VARCHAR(100), 
                B093 VARCHAR(100), 
                B094 VARCHAR(100), 
                B095 VARCHAR(100), 
                B096 VARCHAR(100), 
                B097 VARCHAR(100), 
                B098 VARCHAR(100), 
                B099 VARCHAR(100), 
                B100 VARCHAR(100), 
                B101 VARCHAR(100), 
                B102 VARCHAR(100), 
                B103 VARCHAR(100), 
                B104 VARCHAR(100), 
                B105 VARCHAR(100), 
                B106 VARCHAR(100), 
                B107 VARCHAR(100), 
                B108 VARCHAR(100), 
                B109 VARCHAR(100), 
                B110 VARCHAR(100), 
                B111 VARCHAR(100), 
                B112 VARCHAR(100), 
                B113 VARCHAR(100), 
                B114 VARCHAR(100), 
                B115 VARCHAR(100), 
                B116 VARCHAR(100), 
                B117 VARCHAR(100), 
                B118 VARCHAR(100), 
                B119 VARCHAR(100), 
                B120 VARCHAR(100), 
                B121 VARCHAR(100), 
                B122 VARCHAR(100), 
                B123 VARCHAR(100), 
                B124 VARCHAR(100), 
                B125 VARCHAR(100), 
                B126 VARCHAR(100), 
                B127 VARCHAR(100)
            ) 


SET @lastId = SCOPE_IDENTITY();

EXEC sp_xml_removedocument 
   @idoc;   --never a bad idea to clean up!
于 2015-01-22T00:23:18.110 に答える