6

申し訳ありませんが、関連性のない解決策を避けるために、多くの情報を提供しようとしています。

私の目標は、少なくとも1つのUPDATEステートメントをSELECTステートメントに埋め込んで、selectステートメントが実行される直前に計算値を更新できるようにすることです(SELECTのTRIGGERのように考えてください)。使用しているシステムに制約されているため、VIEWはすぐには解決できません(以下を参照)。

機能に弱いサードパーティの商用ERPをカスタマイズしています(システムは無名のままです!-結果として、聞いたことはありませんが、自家栽培ではありません)。これには、テキスト/GUIを使用してSELECTクエリを作成できる既定のクエリ機能があります。クエリを保存すると、ユーザーはクエリをクリックして実行し、結果を確認できます。ERPはMSSQLServer2000上で実行されます。現在、バージョンアップグレードはカードに含まれていません。ERPの外で必要な機能セットを好きな言語で書くことができます。機能がそれを正当化するのであれば、私は過去にこれを行いました。しかし、私のユーザーコミュニティは、ERPシステムでカスタマイズを行うことができれば簡単だと感じています。

クエリは任意に複雑にすることができますが、ERPパッケージはSQLSelectステートメント自体を構築します。コンパイルされたERPの内部は、次のようなものです(これは単なる推測です!):

"SELECT " + fieldList + " FROM " + tableListAndJoins + " WHERE " + whereCond

GUIビルダーは、初心者ユーザーがfieldListなどを作成するのに役立ちますが、上記のように組み合わせたときにSQLが有効である限り、それをバイパスして句をテキストで記述することができます。

select句、where句などにあるかどうかにかかわらず、SELECTステートメントの副作用としてストアドプロシージャを実行するための呪文を見つけることができないようです。システムをジェイルブレイクする方法は本当に気にしません-安定した基盤となるSQLサーバー自体のセキュリティを変更する必要がない限り、SQLインジェクション攻撃は問題ありません。UDFを見てきましたが、UPDATEステートメントをスカラーUDFに入れることはできず、テーブルUDFの戻り値を変更しようとしても意味がありません(またはそうしますか?)。VIEW内から更新できる場合は、例を見たいと思いますが、VIEWを使用して列を計算できることはわかっていますが、それは私が探している解決策ではありません。ある種のXP_を使用してこれを達成できることについての示唆的な声明をオンラインで読みましたが、どのXP_またはそれを行う方法についてはわかりません。

この質問は、それ自体では解決策ではありません。selectステートメント内のテーブルを更新する

4

5 に答える 5

1

SQL 2000 で SELECT と UPDATE を組み合わせる方法が思い浮かびません (ただし、2005 年以降は OUTPUT 句を使用できます)。ただし、「SELECT」、「FROM」、および「WHERE」と連結された 3 つの文字列値 (fieldList、tableListAndJoins、whereCond) を取得しているように見えますが、それらが重大な SQL インジェクションのようなコード検出を行わないと仮定すると、次のようなものをまとめることができるかもしれません:

fileList = "NULL where 1 = 0; UPDATE MyTable set MyColumn = 'Whatever' where SomeColumn = 'Criteria'; SELECT MyColumn"

tableListAndJoins = "MyTable"

whereCond = "SomeColumn = 'Criteria'"

[セミコロンは実際には省略可能であり、SQL 2000 では機能しない可能性があります。あるコマンドが終了し、次のコマンドが開始する場所を明確にするだけです。]

これの欠点は、2 つのデータ セットが返されることです。最初は空の 1 列のセット (列に名前が必要な場合は NULL のエイリアス) になり、必要なデータは 2 番目のセットになります。これら 3 つの値の使用方法とエラーの検出方法によっては、他の回避策が考えられる場合があります。(最初のクエリが生成されてエラーが発生し、更新と 2 番目のクエリが成功することを願っていますか?)

于 2009-06-29T20:46:59.463 に答える
0

ここの最後の応答に記載されているように、ストアドプロシージャで動的SQLを使用してみてください

元の作者が自分にふさわしいクレジットを取得できるようにリンクされており、うまくいけばあなたに役立つでしょう。

また、UPDATEの前にSELECTが必要なため、私が投稿したリンクのように動的SQLを変更して、最初にSELECTを実行できます。

于 2009-06-29T18:30:00.090 に答える
0

あなたの状況の制約を理解しているかどうかはわかりませんが、次のような2つのステートメントを同時に実行することはできません。

string sql = "update MyTable set x=y;select x from MyTable;";
于 2009-06-29T18:31:23.130 に答える
0

ストアド関数はオプションでしょうか?これらは、ストアドプロシージャよりもシームレスに(少なくともMySQLでは)呼び出すことができます。「callPROCEDURE_NAME(x)」の代わりに、「SELECTFUNCTION_NAME(x)」を使用できます。

于 2009-06-29T18:31:51.570 に答える
0

XPについての私の推測では、更新を行うために独自のXPを作成し、それを何らかの方法でクエリに含めると思います。それが機能するかどうか、そしてSQLがデータを調べる前に実行されるようにクエリのどこに行くべきかは、私を完全に超えています。

あなたは私が試みるほとんどすべてを試したようです。選択を実行した、状態を更新するのはおそらくかなり簡単なので、私はあなたのために感じます。

于 2009-06-29T18:34:16.387 に答える