タグ付けされた質問 「stored-procedures」

データベースマネージャーにインストールされた呼び出し可能なコードは、それを呼び出すことができるAPIを公開します。通常、ネイティブクエリ言語で記述されますが、一部のDBMSプラットフォームは他の言語もサポートしています。

3
テーブルに数式を保存し、関数でその数式を使用する
PostgreSQL 9.1データベースがあり、その一部がエージェントの手数料を処理しています。各エージェントには、彼らが得る手数料の計算式があります。エージェントごとのコミッションを生成する機能を持っていますが、エージェント数が増えると使えなくなります。非常に長いケースステートメントと繰り返しコードを実行することを余儀なくされたため、私の機能が非常に大きくなりました。 すべての数式には定数変数があります: d ..その月に働いた日数 r ..獲得した新しいノード l ..ロイヤルティスコア s ..サブエージェント手数料 b ..基本レート i ..獲得した収益 式は次のようになります。 d*b+(l*4+r)+(i/d)+s 各エージェントは、HR部門と支払い式を交渉します。では、式をエージェントテーブルに保存して、テーブルから式を取得して値で変換し、金額を計算するだけの小さな関数のようにできますか?

1
動的に作成されたテーブルデータを返すストアドプロシージャ
簡単に言えば、調査システムを備えた外部ベンダーと協力しています。システムは、新しい調査を作成し、システムが新しいテーブルを作成するときに、必ずしも次のように設計されているとは限りません。 Tables ____ Library_1 -- table for Survey 1 SurveyId int InstanceId int Q_1 varchar(50) Library_2 -- table for Survey 2 SurveyId int InstanceId int Q_2 int Q_3 int Q_4 varchar(255) テーブルはで生成されたSurveyId名前の末尾に(Library_)と質問の列がで生成されQuestionId、それの終わり(でQ_)。 明確にするために、質問は別のテーブルに格納されているため、質問IDは連続していますが、各調査で1から開始されません。質問の列は、テーブルで割り当てられたIDに基づいています。 別のシステムに送信するためにすべての調査テーブルからデータを抽出する必要があることを除いて、クエリを実行するのに十分簡単なようです。これは問題が発生する場所です。新しい調査がフロントによって追加されると、テーブルが自動的に作成されるため、アプリケーションを終了すると、他のシステムはこのタイプの構造を処理できません。彼らは消費するためにデータが一貫している必要があります。 そのため、すべてのSurveyテーブルからデータを抽出して次の形式で配置するストアドプロシージャを作成する必要がありました。 SurveyId InstanceId QNumber Response ________ __________ _______ ________ 1 1 1 great 1 2 1 …

3
(他のストアドプロシージャで)ストアドプロシージャが使用されている場所をどのように見つけますか
何千ものSPを持つデータベースに、リファクタリングしたいストアドプロシージャがあります。他のSPでそのストアドプロシージャへの参照をすばやく見つける方法はありますか?そうすれば、リファクタリングするときに他のコードを壊していないことを確認できます。 アプリケーションコードでは、SPへの呼び出しを簡単に検索でき、SPを定義するさまざまなSQLファイルすべてに対してテキスト検索を実行できますが、データベース内に一部のSPが存在しない可能性があります。 。 編集:私が見つけようとしているストアドプロシージャは、パッケージの一部です。 編集:私はOracle 11gで実行しています

1
mysqldumpはトリガーとプロシージャをダンプできますか?
指定されたデータベースからすべてのトリガーとプロシージャを保存するmysqldumpを作成する方法はありますか? 少し前に私はそれを読んでmysqldumpトリガーも保存されますが、そのようには見えません。2つ目の関連する質問は、トリガーが存在する場合にSQLファイルをチェックインするにはどうすればよいですか?

2
ORDER BY CASE式での「変換失敗」エラー
'OrderBy'を 'OrderNumber'に設定した場合を除いて、次のストアドプロシージャがうまく機能します。 次のエラーが表示されます。nvarchar値 'SK11270'をデータ型intに変換するときに変換に失敗しました。 (SK11270は、nvarchar(50)であるOrderNumber列の値です) 他のOrderBy列で同じクエリを実行すると、正常に機能します。 私は完全に道に迷い、頭が痛い。誰もがこの問題を引き起こしている明らかな何かを見ることができますか? 任意のアイデアを事前にありがとう... リッチ これは機能します: sp_jobs '1','20','','JobNumber','ASC','97','True','True','True','True','True','True','True','True','True','False','True','False','True','False','0' これはしません: sp_jobs '1','20','','OrderNumber','ASC','97','True','True','True','True','True','True','True','True','True','False','True','False','True','False','0' PROCEDURE [dbo].[sp_Jobs] @PageNumber int, @PageSize int, @FilterExpression varchar(500), @OrderBy varchar(50), @OrderDirection varchar(50), @CustomerID int, @ShowNotSet bit, @ShowPlaced bit, @ShowProofed bit, @ShowReProofed bit, @ShowApproved bit, @ShowOnTime bit, @ShowLate bit, @ShowProblem bit, @ShowCompleted bit, @ShowDispatched bit, @ShowUnapproved …

2
sp_msforeachdbは、舞台裏でどのように正確に機能しますか?
発生している問題をトラブルシューティングする必要があります。また、問題を解決するためにsp_msforeachdbがどのように機能するかを理解するための支援が必要です。 sp_msforeachdbを実行するたびにエラーが発生する Msg 102, Level 15, State 1, Incorrect syntax near '61' 私のコードの例は次のとおりです: EXEC SP_msforeachdb 'SELECT ''?'' AS Database FROM ?.sys.objects WHERE name like ''%aetna%'' ただし、sp_msforeachdbのパラメーターとしてどのクエリを使用してもかまいません。同じエラーが発生するたびに。「61s1d」で始まるデータベースがあるので、DB名に問題があると思いますが、sp_msforeachdbの背後で何が起こっているのか、正直にわかりません。 注意事項。 数字で始まる唯一のデータベース 「データベースが '%61%'のようなものではありません……」のようなコードを使用することはできますが、それでも同じエラーが発生します。 データベース名の変更をテストすることはできません-接続しているものが多すぎます。 「51」で始まるテストデータベースを作成すると、そのデータベースのエラーも表示されます どうすればこれを克服できますか?

1
xmlパラメータを使用して複数のデータをアップサートするときにマージクエリの使用を回避する方法
値の配列でテーブルを更新しようとしています。配列の各項目には、SQL Serverデータベースのテーブルの行と一致する情報が含まれています。行がテーブルに既に存在する場合、その行を指定された配列の情報で更新します。それ以外の場合は、テーブルに新しい行を挿入します。基本的にアップサートについて説明しました。 現在、私はこれを、XMLパラメーターを受け取るストアード・プロシージャーで実現しようとしています。テーブル値パラメーターではなくXMLを使用する理由は、後者の場合、SQLでカスタムタイプを作成し、このタイプをストアドプロシージャに関連付ける必要があるためです。将来、ストアドプロシージャまたはdbスキーマの何かを変更した場合、ストアドプロシージャとカスタムタイプの両方をやり直す必要があります。このような状況は避けたいです。さらに、データ配列のサイズが1000を超えることはないため、TVPがXMLよりも優れていることは、私の状況では役に立ちません。これは、ここで提案されているソリューションを使用できないことを意味します。SQLServer 2008でXMLを使用して複数のレコードを挿入する方法 また、ここでの同様のディスカッション(UPSERT-MERGEまたは@@ rowcountのより良い代替案はありますか?)は、テーブルに複数の行をアップサートしようとしているため、私が求めているものとは異なります。 次の一連のクエリを使用して、xmlから値を更新することを望んでいました。しかし、これはうまくいきません。このアプローチは、入力が単一の行である場合にのみ機能すると想定されています。 begin tran update table with (serializable) set select * from xml_param where key = @key if @@rowcount = 0 begin insert table (key, ...) values (@key,..) end commit tran 次の代替方法は、完全なIF EXISTSまたは次の形式のバリエーションの1つを使用することです。しかし、私は次善の効率であることを理由にこれを拒否します: IF (SELECT COUNT ... ) > 0 UPDATE ELSE INSERT 次のオプションは、http://www.databasejournal.com/features/mssql/using-the-merge-statement-to-perform-an-upsert.htmlで説明されているようにMergeステートメントを使用することでした。しかし、それから私はここでマージクエリの問題について読みました:http : …

2
リンクサーバーを参照するポータブルSQLを作成するにはどうすればよいですか?
リンクサーバーを参照するストアドプロシージャを持っています。手順全体のいくつかの場所で、次のようなものが得られます。 INSERT INTO [TableName] (...Columns...) SELECT ...Columns... FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName] WHERE TableNameID = @TableNameID この手順は、私の開発環境、テスト環境、およびライブ環境に存在します。 問題は、サーバー名が環境ごとに異なるため、プロシージャの各コピーが微妙に異なることです。これにより、スクリプト更新の展開の管理が面倒になります。 各環境で同じバージョンのプロシージャを実行できるように、プロシージャを移植可能にする方法はありますか? そうでない場合、スクリプトの展開を間違い/エラーに陥らなくするために私ができることはありますか?

2
mysql.procがクラッシュし続けますが、mysqldumpを実行できませんか?
InnoDBのいくつかの問題のため、すべてのデータベースを新しいサーバーにダンプします。 mysqldump -E -R --all-databases | pv -b | mysql -u root -p -h new.server ダンププロセスはエラーで停止しました: 59.9kB assword: 59.9kB ERROR 145 (HY000) at line 2970: Table './mysql/proc' is marked as crashed and should be repaired 228MB mysqldump: Got errno 32 on write 次のコマンドを実行して、すべてのデータベースのすべてのテーブルを修復しました。 mysqlcheck --auto-repair --all-databases mysql.procステータスを調べると、次のことがわかります。 mysql> check table …

4
SQL Server 2008 R2でテーブルを使用しているストアドプロシージャまたはトリガーを知るにはどうすればよいですか?
これは、私がチェックしているDBに、ユーザー履歴を保持するアーカイブテーブルがあり、しばらくするとこのテーブルから行を削除するトリガーまたはストアプロシージャがあり、同じように、私はDBを設計しませんでした。このDBを使用するアプリケーションのメンテナンスを行っているだけなので、これらのストアドプロシージャまたはトリガーの名前がわかりません。このストアドプロシージャを探します。またはトリガーして、コードを確認し、この「ユーザー履歴」をテーブルに長く残すようにコードを変更します。 誰かが「sysobjects」テーブルをチェックするように言われました。そこでは、テーブルの同じ名前の何かが実際に表示されますが、これは私が取得できた唯一の情報です。アドバイスはありますか? ありがとうございました。

2
一時テーブルまたはテーブル変数を使用してSQL ServerストアドプロシージャをOracleに移行する方法
SQL Serverストアドプロシージャを作成するよう経営陣に勧められたC#開発者は、このようなプロシージャを生成することがよくあります。 create table #t1 (...); insert into #t1 Select ... from table_a where ...; insert into #t1 Select ... from table_b where ...; update #t1 Set ... = ... where ... Select * from #t1; 単一のステートメントはかなり単純であり、この方法により、正しい結果が生成されます。 多くの場合、私の仕事はそのような手順をOracleに移行することです。 次の事実に直面しましょう。 SQL Serverの異なる一時テーブルは完全に独立しており、任意のアドホック構造を持つことができます。 Oracleグローバル共通テーブルはグローバルオブジェクトであり、すべての用途で同じテーブル構造を共有します。この構造はどこでも使用されていますが、変更することはできません。 Oracle dbaから学んだことの1つは、可能な場合は常に一時テーブルの使用を避けることでした。SQLサーバーのパフォーマンスでさえ、このような変更の恩恵を受けます。 個々のインサートをユニオンに置き換える 最も単純なケースでは、上記は次のようなものに変換できます。 select case when ... …

2
複数のユーザーが一時テーブルでストアドプロシージャを同時に実行できないのはいつですか?
最近TechNetで読んだ一時テーブルに関するドキュメントについて質問があります。そのページの一時テーブルセクションの4番目の段落は、次のようになります。 名前付き制約を使用して一時テーブルが作成され、一時テーブルがユーザー定義のトランザクションのスコープ内で作成される場合、一時テーブルを作成するステートメントを実行できるのは一度に1人のユーザーだけです。たとえば、ストアドプロシージャが名前付きの主キー制約を持つ一時テーブルを作成する場合、そのストアドプロシージャを複数のユーザーが同時に実行することはできません。 私は、インデックス化された一時テーブルを使用する少数のストアドプロシージャを大幅に利用する環境で作業しており、ユーザーが次の処理が始まる前に実行が完了するのを待たなければならないという問題に遭遇したことはありません。それが今後も続くことを願っていますが、この警告が適切に理解されていないと問題になる可能性があることを懸念しています。 具体的には、次の点については不明です。 これはグローバル一時テーブルにのみ適用されますか、それともローカル一時テーブルにも適用されますか?(後者の場合のように)セッションの外部に表示されないテーブルが別のセッションの同時実行を妨げるのは奇妙に思われます。 「名前付き制約」とは何ですか?すべての制約に名前が付いているわけではありませんか(システムで生成された場合でも)。これは、ユーザー定義のエイリアスを持つ制約を参照していますか?これは私には言い回しのように思えます。 「複数のユーザー」は実際には複数のセッションを意味しますか?これらの手順は、単一のサービスアカウントを使用してアプリケーションから呼び出されるため、スクリプトへの呼び出しの99.9%はその単一のアカウントによってDBに対して行われます(そして、管理者がバックエンドでときどき呼び出す可能性があるのではないかと心配しています)。サービスアカウントが複数のセッションで同時にsprocを実行できる場合、この問題は私の目的には当てはまりません。

6
ストアドプロシージャを並列で実行する
同じストアドプロシージャを、異なるパラメーターを使用して複数回同時に実行しようとしています。 SQL 2014を使用しています これは、手順が完了するまでに約7時間かかるためです。実際には同じプロセスを何度も実行します。したがって、たとえば、ブランチごとに新しいデータベースとテーブルを構築する場合があります。 ストアドプロシージャを分解して、ブランチごとに実行し、各クエリを並行して実行できるようにしたいと思います。私はこれを個別のクエリウィンドウで実行することでテストしましたが、ほぼ80%速く実行されます。 誰かが私にクエリを並行して実行するためのダミーガイドを教えてもらえますか?

1
MySQL->テーブルをループし、各エントリでストアドプロシージャを実行します
私は「本」(子供向けの短編小説)のデータベースを持っています。本の各単語の単語数を知ることは非常に有益です。 私は各単語の単語数を取得する方法を理解しました: SELECT SUM ( ROUND ( (LENGTH(pageText) - LENGTH (REPLACE (pageText, "Word", ""))) /LENGTH("Word") ) ) FROM pages WHERE bookID = id; これは単語を数えるのに素晴らしい働きをします。しかし、それは私が各本を読み、各単語を取り出し、その関数を実行する必要があります(私はそれをストアドプロシージャとして保存しています)。 重複のない、各単語を含むテーブルがあります。 私の質問:ストアドプロシージャを使用してWordsテーブルで何らかの "for each"ループを実行する方法はありますか? すなわち。ストアドプロシージャに書籍IDと単語を渡して、結果を記録します。すべての本のために、すべての言葉を行う。したがって、多くの手動時間を節約できます...これは私がDB側からでも行う必要があることですか?代わりにPHPで試す必要がありますか? 正直なところ、どんな入力でも大歓迎です!

4
Linuxターミナルを介してMySQLストアドプロシージャを作成する方法
mysqlコンソールでは、delimiterコマンドを使用して区切り文字を変更します。手順を定義すると便利です。delimitermysqlクライアントのみのコマンド(クライアント側コマンド)を理解しました 。 しかし、私はのdelimiter ようなコマンドを持たないmysqlクライアントdbslayerを使用しています。この種のクライアントでは、どのようにプロシージャを定義できますか。 今のところ検討: create procedure test_pro() begin select 'hello pro'; end 私は以下を試しました: mysql -u root -pmypass test < proc_file ここで、proc_fileには上記の手順が含まれています。 しかし、それは私に次のエラーを与えています: ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.