2017-06-08 5 views
0

私は読んでいるAPIを持っているので、更新されたフィールドだけが表示されます。私はそれを取ってストアドプロシージャを使用して私のテーブルを更新しようとしています。これまでのところ、私はこれを行う方法を理解できた唯一の方法は動的SQLを使用することですが、そうでない方法があればそれをしない方がよいでしょう。異なる列を更新するストアドプロシージャ

これはほんの数のコラムだったのですが、私はそれぞれのためにprocを書いていますが、約100個のフィールドについて話しています。 1つのチケットには、この時点で更新されたタイムスタンプが必要な場合がありますが、次のチケットはタイムスタンプで、次のチケットはメモであるかもしれません。

私が読んで教えてくれたことはすべて、動的SQLが悪いと言いました。私もそれを書いていますが、私はprocを持っています。

IF EXISTS (SELECT * FROM NEWTABLE NOT IN (SELECT * FROM OLDTABLE)) 
BEGIN 
UPDATE OLDTABLE 
    SET OLDTABLE.OLDRECORDS = NEWTABLE.NEWRECORDS 
    WHERE OLDTABLE.PRIMARYKEY= NEWTABLE.PRIMARYKEY 
END 

答えて

0

あなたはおそらく、この:::ような何かを行うことができ:

行い、ターゲット表上の操作を挿入、更新、または削除しますソース表との結合の結果に基づいて実行されます。たとえば、あるテーブルの行を挿入、更新、または削除することによって、2つのテーブルを同期させることができます。

ご覧のとおり、アップデートはより複雑で効率的なものになる可能性があります。 MERGEを使用するにはいくつかの熟練が必要ですが、使い始めると何度も何度も喜んで使用します。

0

あなたの問題を解決する最良の方法はMERGEを使用している

0

ビジネスロジックがどのように動作して、いつどの列が更新されるかを判断する方法がわかりません。関数ごとに異なるが一貫性のある列を更新する必要のある個別のビジネス関数がある場合は、おそらくそれぞれの関数に対して個別のupdateステートメントが必要です。これにより、各プロセスが更新する必要がある列のみが更新されるようになります。

一方、あなたのAPIが本当にあらかじめわかっていないようなものであれば、動的SQLクエリを構築することは良いアイデアです。

また、ユーザーが設定可能なフィールドをすべて設定する保存プロシージャを作成することもできます。呼び出し元プロセスにすべてのデータがある限り、saveプロシージャを呼び出してすべての更新可能な列を渡すことができます。各側に同じ値を持つUPDATE MyTable SET MyCol = @MyColを持つことに害はありません。

すべての値が同じ場合でも、rowversion(またはtimestamp列)は更新されます(存在する場合)。

このソフトウェアでは、ユーザーが編集できる表の幅が大きく異なります。パラメータとしてupdate-ableのすべての列を持つ各表に対して、単一の保存プロシージャを作成することを選択しました。呼び出しプロセス(Webサーバー)には、必要な列がすべてメモリに格納されています。彼らはすべての呼び出しですべての列を渡します。これは我々の目的のためにうまくいく。

関連する問題