問題タブ [stored-procedures]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - SQL サーバーのストアド プロシージャをバージョン管理する最良の方法は何ですか?
データベース オブジェクトをバージョン管理する最良の方法は何ですか? Visual Studio 2005/2008 と SQL Server 2005 を使用しています。SVN で使用できるソリューションを希望します。
sql - SQL Server で呼び出し元のストアド プロシージャを見つける
誰がストア プロシージャを呼び出したかを特定することはできますか?
たとえば、 でエラーが発生したとしproc3
ます。proc1
そのプロシージャ内から、またはによって呼び出されたかどうかを知りたいですproc2
。
sql - SQL ストアド プロシージャ内の動的並べ替え
これは、私が過去に何時間もかけて調査してきた問題です。これは、最新のRDBMSソリューションによって対処されるべきものであるように思えますが、データベース バックエンドを備えた Web または Windows アプリケーションで信じられないほど一般的なニーズであると私が考えるものに実際に対処するものはまだ見つかっていません。
動的ソートについて話します。私のファンタジーの世界では、次のような単純なものにする必要があります。
これは、インターネット上のあらゆるフォーラムで、初心者の SQL およびストアド プロシージャの開発者によって与えられた標準的な例です。「なぜこれができないのですか?」彼らが聞く。ORDER BY
必ず、最終的には、ストアド プロシージャのコンパイルされた性質、一般的な実行計画、およびパラメータを句に直接入れることができないその他のあらゆる種類の理由について講義するために誰かがやって来ます。
「それでは、クライアントにソートを任せてください」と、すでに考えている人もいると思います。当然、これによりデータベースから作業がオフロードされます。ただし、私たちの場合、データベース サーバーは 99% の時間で汗をかきさえしておらず、まだマルチコアでもなく、6 か月ごとに行われるシステム アーキテクチャのその他の無数の改善も行っていません。この理由だけでも、データベースでソートを処理することは問題になりません。さらに、データベースは非常に仕分け上手。彼らはそれのために最適化されており、それを正しく行うために何年も費やしてきました.それを行うための言語は信じられないほど柔軟で直感的でシンプルであり、何よりも初心者のSQLライターはそれを行う方法を知っています.変更を加えたり、メンテナンスを行ったりします。データベースに負担がかからず、開発時間を単純化 (および短縮) したいだけの場合、これは当然の選択のように思えます。
次に、Web の問題です。クライアント側で HTML テーブルの並べ替えを行う JavaScript をいじってみましたが、必然的に私のニーズに十分に柔軟に対応できません。 JavaScript ソーターを書き直したり、自作したりするのにかかる時間を正当化するのに苦労しています。同じことがサーバー側のソートにも一般的に当てはまりますが、すでにおそらく JavaScript よりもはるかに好まれています。私は特に DataSet のオーバーヘッドが好きではないので、訴えてください。
しかし、これは、それが不可能である、というより、簡単ではないという点を思い起こさせます。私は、以前のシステムで、動的ソートを取得する信じられないほどハックな方法を実行しました。それは美しくもなく、直観的でもなく、単純でも柔軟でもなく、初心者の SQL ライターは数秒で失われてしまうでしょう。すでにこれは「解決策」ではなく「複雑化」しているように見えます。
次の例は、ベスト プラクティスや優れたコーディング スタイルなどを公開することを意図したものではなく、T-SQL プログラマーとしての私の能力を示すものでもありません。私は、それらが紛らわしく、悪い形式であり、ただのハックであることを完全に認めます。
整数値をパラメーターとしてストアド プロシージャに渡し (パラメーターを単に "sort" と呼びましょう)、そこから他の変数の束を決定します。たとえば...並べ替えが1(またはデフォルト)であるとしましょう:
他の列を定義するためにさらに @colX 変数を宣言した場合、「並べ替え」の値に基づいて並べ替える列で実際にクリエイティブになる方法を既に確認できます...それを使用すると、通常は次のようになります非常に厄介な節:
明らかに、これは非常に簡略化された例です。実際には、通常、並べ替えをサポートする列が 4 つまたは 5 つあるため、それぞれに 2 番目または 3 番目の列があり、それに加えて並べ替えることができます (たとえば、日付の降順で、次に名前の昇順で並べ替えられます)。ケースの数を効果的に 2 倍にする方向性ソート。うん…毛むくじゃらになるのは本当に早い。
アイデアは、vehicleid が storagedatetime の前にソートされるようにソートケースを「簡単に」変更できるということです...しかし、少なくともこの単純な例では、擬似的な柔軟性は本当にそこで終わります。基本的に、テストに失敗した各ケース (今回は並べ替えメソッドが適用されないため) は NULL 値をレンダリングします。したがって、次のように機能する句になります。
あなたはアイデアを得る。これが機能するのは、SQL Server が order by 句で null 値を効果的に無視するためです。これは、SQL の基本的な作業知識を持っている人なら誰でもわかるように、維持するのが非常に困難です。私があなたの誰かを失ったとしても、気にしないでください。機能するようになるまでには長い時間がかかりましたが、それを編集したり、同様の新しいものを作成したりしようとして、いまだに混乱しています。ありがたいことに、頻繁に変更する必要はありません。
それでもうまくいきました。
私の質問は次のとおり です。より良い方法はありますか?
ストアド プロシージャ以外のソリューションでも問題ありません。できれば、誰かがストアド プロシージャ内でより適切に実行できるかどうかを知りたいのですが、そうでない場合は、ASP.NET を使用してユーザーがデータ テーブルを動的に (双方向にも) ソートできるようにするにはどうすればよいでしょうか?
そして、このような長い質問を読んでくれて (または少なくともスキミングして) ありがとうございました!
PS: 動的ソート、列の動的フィルタリング/テキスト検索、ROWNUMBER() OVER によるページネーション、およびtry...エラー時のトランザクション ロールバックによるキャッチをサポートするストアド プロシージャの例を示していないことを嬉しく思います... 「巨大なサイズ」は、それらを説明し始めることすらありません.
アップデート:
- 動的 SQL は避けたいです。文字列を一緒に解析してそれに対して EXEC を実行すると、そもそもストアド プロシージャを使用する目的の多くが無効になります。少なくともこれらの特別な動的ソートのケースでは、そのようなことをすることの短所は価値がないのではないかと思うことがあります。それでも、このような動的な SQL 文字列を処理するときは常に汚いと感じます — まだクラシック ASP の世界に住んでいるように。
- そもそもストアド プロシージャが必要な理由の多くは、セキュリティのためです。私はセキュリティ上の懸念について電話をかけることはできません。解決策を提案するだけです。SQL Server 2005 では、個々のストアド プロシージャのスキーマ レベルでアクセス許可を (必要に応じてユーザーごとに) 設定し、テーブルに対するクエリを直接拒否できます。このアプローチの長所と短所を批判することは、おそらく別の質問ですが、これも私の決定ではありません。私はリードコードモンキーです。:)
sql - ストアド プロシージャの所有権の連鎖
データベースには、別のデータベースに格納されているデータマートからデータをロードするために使用されるストアド プロシージャがいくつかあります。これらの手順は、通常、次の形式です。
これらは、SQL Server Management Studio でクエリを実行すると正常に実行されます。EXEC load_stuff を使用してそれらを実行しようとすると、手順はセキュリティ警告で失敗します。
サーバー プリンシパル "the_user" は、現在のセキュリティ コンテキストではデータベース "data_mart" にアクセスできません。
sproc の OWNER は dbo で、これは the_user です (この例のために)。両方のデータベースの OWNER も the_user であり、the_user は dbo にマップされます (これは SQL Server が行うべきことです)。
SQL Server でこのエラーが表示されるのはなぜですか? これは、問題のユーザーが dbo としてエイリアス化されており、クロスデータベース データ アクセスに別のユーザー アカウントを使用する必要があるためですか?
編集 これは、SQL Server がクロス データベース所有権チェーンをデフォルトで無効にしているためであると理解しています。これは良いことです。ただし、この状況でのベストプラクティスはわかりません。このシナリオのベスト プラクティスについて意見をお持ちの方がいらっしゃいましたら、よろしくお願いいたします。
編集 2 最終的な解決策は、両方のデータベースで TRUSTWORTHY ON を設定することでした。これにより、完全なデータベース所有権の連鎖に頼ることなく、2 つのデータベース間の限定的な所有権の連鎖が可能になります。
delphi - キャッシュ フロー レポートのストアド プロシージャを置き換えるアイデア
基本的にこの構造のキャッシュ フロー レポートがあります。
主な問題は残高です。Data に DataSet を使用しているため、前日の残高が常に必要になるため、DataSet で残高を計算するのはちょっと難しいです。
また、このデータは複数のテーブルから取得され、データベースのメタデータが頻繁に変更されるため、この手順を維持するのは困難です。
誰かが私にいくつかの可能な異なる解決策を教えてもらえますか? 問題のために?
このレポートは DataGrid に表示されています。
sql - null をチェックするための追加の where 句をアクティブにするストアド プロシージャ ビット パラメータ
次のようなストアド プロシージャがあります。
言うまでもなく、これはうまくいきません。@AdditionalFilter パラメータをチェックする追加の where 句を有効にするにはどうすればよいですか? 助けてくれてありがとう。
java - Java/.Net プロファイラーに似た SQL Server プロファイラーはありますか?
Java/.Net アプリをプロファイリングして、パフォーマンスのボトルネックやメモリの問題を見つける方法が気に入っています。たとえば、メソッドごとの実行時間と呼び出し回数を含む呼び出しツリーを見ると、パフォーマンスのボトルネックを見つけるのは非常に簡単です。SQL Server には、ビューに依存する他のストアド プロシージャを呼び出すストアド プロシージャがあります。これは、他のメソッドを呼び出す Java/.Net メソッドに似ています。したがって、同じ種類のプロファイラーがここで非常に役立つようです。しかし、遠くを探しても一匹も見つかりませんでした。SQL Server またはその他の DBMS 用のそのようなツールを知っている人はいますか?
更新: SQL Server プロファイラーに関するご返信ありがとうございます。ただし、このツールは非常に限られています。スクリーンショットを見てください。
c# - ストアドプロシージャのデフォルト値
SQLに関しては、私は初心者です。そのようなパラメータを使用してストアドプロシージャを作成する場合:
これは、T-SQLのデフォルト値の正しい形式ですか?''の代わりにNULLを使用しようとしました。
C#を使用してこの手順を実行しようとすると、説明が予期されているが提供されていないという事実を参照してエラーが発生します。このように呼び出すとき:
result.Descriptionがnullです。これはSQLでデフォルトでNULL(私の場合は今のところ'')にすべきではありませんか?
呼び出しコマンドは次のとおりです。
c# - なぜ OleDbCommand.Prepare() が必要なのですか?
次のように、保存されたクエリ(「UpdatePaid」という名前、3つのパラメーター)を介してMSAccessテーブルに対応するデータグリッドとアダプターを使用しています。
それは正常に動作します...しかし、本当に奇妙なことは、 odc.Prepare()呼び出しを入れるまでうまくいかなかったことです。したがって、私の質問は次のとおりです。OleDb ストアド プロシージャ/クエリを操作するときに、常にそれを行う必要がありますか? なんで?また、SqlDbCommand を使用して同じことを行う必要がある別のプロジェクトも予定されています...それらも使用する必要がありますか?
sql - SQL Server 2000 でストアド プロシージャが最後に変更された時期を特定することはできますか?
SQL Server 2005 でこれを実行できることは知っていますが、2000 については迷っています。