質問

この長さのため申し訳ありませんが、私は、非関連のソリューションを避けるために、情報の多くを与えるためにしようとしています。

私の目標は、私はselect文の実行(SELECT上のTRIGGERのようにそれを考える)前の時点で、いくつかの計算された値を更新する機会を持つように、SELECT文の中に、少なくとも1つのUPDATE文を埋め込むことです。私は、私が使用しているシステムによって制約てるので、VIEW(下記参照)、即時の解決策ではありません。

私は(! - 結論は、あなたがそれを聞いていないが、その家のどちらか成長していないされているシステムは、無名のままになります)機能に弱く、サードパーティの商業ERPをカスタマイズしています。それは私がSELECTクエリを構築するために、テキスト/ GUIを使用することができます準備されたクエリの施設があります。私は、クエリを保存すると、ユーザーはそれを実行して結果を確認するために、クエリをクリックすることができます。 ERPは、MS SQL Server 2000の上に実行されます。バージョンアップは、今のカードではありません。特徴は、それを保証する場合、私は私が私が好きな言語でのERPの外に必要なものは何でも機能セットを書くことができます、私は、過去にこれを行っています。私のカスタマイズがERPシステムで行うことができたときに私のユーザーコミュニティが簡単にそれを見つけます。

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

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

GUIビルダーは、初心者ユーザーがフィールドリストを構築し、その上が、あなたがそれを迂回している限り、上記のように組み合わされたときにSQLが有効であるとして、テキスト内の句を書くことができるのに役立ちます。

私はそれが私がシステムを脱獄どのように私は本当に気にしないなどのselect句、節、中のかどうか、SELECT文の副作用としてストアドプロシージャを実行するための呪文を見つけるように見えることはできません - - 安定したSQLインジェクション攻撃は、限り、それは私が、基礎となるSQLサーバー自体のセキュリティを変更しなければならなかったという意味ではありませんでしたとして、罰金になります。私は、UDFのを見てきましたが、あなたは、スカラUDFにUPDATEステートメントを置くことができない、そしてそれは、テーブルUDFの戻り値を変更しようとすることは意味がありません(またはそれをしません?)。あなたはVIEWの中から更新できる場合、私は例を見てみたいが、私は列を計算するためにVIEWを使用することができます実現し、それは私が探しています解決策ではありません。私はこれを達成するためにXP_のいくつかの並べ替えを使用することができることについては、オンライン暗示文を読んで、しかしなどにどのXP_またはそれを行う方法を、私は知りません。

この問題は、それ自体が、解決策ではありません:は、テーブルを更新しますselect文の内

役に立ちましたか?

解決

私は(2005年に最大ものの、OUTPUT句が提供されています)SQL 2000でのUPDATEとSELECTを結合する方法を考えることはできません。しかし、それは、あなたが、「FROM」「SELECT」で一緒に連結得る3つの文字列値(フィールドリスト、tableListAndJoins、whereCond)を取得し、「WHERE」のように見える、と彼らはいくつかの深刻なSQLのinjenctionのようなコードの検出をしないと仮定するとあなたはこのような何かを一緒にその場しのぎすることができるかもしれません。

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

tableListAndJoins = "MyTable"

whereCond = "SomeColumn = 'Criteria'"

[セミコロンは実際にはオプションであり、さらにはSQL 2000で動作しない可能性があります - 。彼らはそれを明確に場所を1つのコマンドが終了し、次が始まる]

これの欠点は、2つのデータセットを取り戻すだろうということです。 (あなたが列に名前をしたい場合にNULLの別名)最初は空の1列のセットになり、必要なデータは、第二のセットになります。その他の回避策は、これらの3つの値が使用され、どのようにエラーがキャッチされている方法に応じて、可能かもしれません。 (最初のクエリが発生し、エラーことをしましょう、と更新を願っていますし、2番目のクエリが通過?)

他のヒント

ここで最後の回答に述べたように、

ストアドプロシージャで動的SQLを使用してみてくださいする

原作者は、彼/彼女が値するクレジットを取得することができますし、うまくいけばあなたに参考になるようにリンクされます。

あなたがUPDATEの前にSELECTしたいので、

そして、あなたが最初のSELECTを行うために、私は投稿のリンクのように動的SQLを変更することができます。

私はあなたの状況の制約を理解していないけど、あなただけのような、一度に2つのステートメントを実行することはできません。

string sql = "update MyTable set x=y;select x from MyTable;";

保存された機能は、オプションのでしょうか?あなたはストアドプロシージャよりも、(少なくともMySQLの中で)よりシームレスにそれらを呼び出すことができます - 代わりにあなただけの「FUNCTION_NAME(X)を選択し、」使用できる「(X)PROCEDURE_NAMEを呼び出す」

XPと私の推測では、アップデートを行うには、独自のXPを書いて、それが何らかの形でクエリに含まれるということです。かどうかは、それがうまくいくとどこクエリでは、SQLは、あなたのデータは私を超え完全に見て前に実行されるように行く必要があります。

あなたはちょうど私がしようとするだろうすべてについて試してみたように、

これが鳴ります。おそらく状態を更新することが比較的容易になるだろうので、私はは、あなたが選択を実行したの後にあなたのために感じています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top