【解決方法】SQL および C# ASP での XML のデータ重複の検証

プログラミングQA


XMLファイルをアップロードするためのアップロードボタンがあるC#aspページがあります:
次に、xml を選択してグリッド ビューで表示できます。これは正常に機能しています。
既にアップロードされているファイルをアップロードするたびに、重複レコードの検証でxmlファイルを拒否します。

xml データを一時テーブルに挿入し、メイン テーブルをチェックするストアド プロシージャを作成しました。同じデータが既に存在する場合は、それらのデータを削除します。

ここで、重複データがあることを示す検証メッセージが必要です。
どうすればいいのですか?

私が試したこと:

私はsprocを持っています

alter PROCEDURE xmldata      
@xml XML , @c_id varchar(100)     

AS     
 
 create table #XMLTable
 (
	ID				int identity,
    [a]        varchar(50),
    [b]           varchar(50),
    [c]           varchar(50)
 )

 BEGIN      
      SET NOCOUNT ON;      
      INSERT INTO  #XMLTable      
      SELECT      
      C.value('(a/text())[1]','VARCHAR(max)') AS [a],      
      C.value('(b/text())[1]','VARCHAR(max)') AS [b],        
      C.value('(c/text())[1]','VARCHAR(max)') AS [c]  
      
      FROM      
         @xml.nodes('/xyz/C')AS TEMPTABLE(C)
		 
delete   #XMLTable from #XMLTable xt inner join main_table mt on xc.[a] = mt.[a] AND xc.[b]=mt.[b] AND xc.[c]=mt.[c] 

    


INSERT INTO main_table


 

select * from #XMLTable 

END 

データの重複の検証を追加する必要があります
(raise error) エラー検証表示をスローしますが、sproc をどのように変更すればよいですか?

解決策 1

まず、delete ステートメントが機能しません エラー: The multi-part identifier "xc.a" could not be bound.エイリアスは次のいずれかである必要があります xc テーブル用や xt. 列の場合。 例えば

SQL
delete   #XMLTable from #XMLTable xc inner join main_table mt on xc.[a] = mt.[a] AND xc.[b]=mt.[b] AND xc.[c]=mt.[c]

次に、テーブルエイリアスを使用しているため、一貫性を保ち、それらのエイリアスを全体で使用することをお勧めします。

SQL
delete xc from #XMLTable xc inner join main_table mt on xc.[a] = mt.[a] AND xc.[b]=mt.[b] AND xc.[c]=mt.[c]

おそらく、検証メッセージを追加する最も簡単な方法は、sproc から出力パラメーターを返すことです。

SQL
, @DupsFound int OUTPUT

重複をテストします それらを削除するなど

SQL
SELECT @DupsFound = COUNT(*)
FROM main_table mt
inner join #XMLTable xc on xc.[a] = mt.[a] AND xc.[b]=mt.[b] AND xc.[c]=mt.[c]

@dupsfound が > 0 の場合、UI レイヤーはメッセージを表示する必要があります。

余談ですが、毎回一時テーブルを作成するのではなく、永続的な「ステージング」テーブルを作成してみませんか

最後に、あなたは ID 一時テーブルの ID フィールド – main_table にも ID ID 列がある場合は、使用する必要があります

SQL
INSERT INTO main_table
select [a],[b],[c] from #XMLTable

* は使用しないでください。自動的に入力される ID 列が含まれるためです。

コメント

タイトルとURLをコピーしました