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

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

1
sp_prepexec(sp_execute)とsp_executeSQL
質問の要点:実際のストアドプロシージャは、一時テーブルキャッシュを実装する唯一のメカニズムですか、それともsp_executeSQL/ などのシステムストアドプロシージャsp_executeもそれらを利用しますか? 私はDBAではないので、少しだけ言葉を使ってください。私たちのアプリケーションは、プロファイラーから、sp_prepexec実行sp_prepareとの両方のシステムプロシージャであるすべてのSQLを実行する準備済みステートメントを送信しますsp_execute。私がやろうとしているのは、一時テーブルのキャッシュから利益を得ているかどうかを判断することです。 このガイドをobject_id()と一緒に使用して動作を調べています https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html 次に、このブログ投稿のポイント3は、EXECは一時テーブルキャッシュを使用できないことを示していますが、sp_executeSQLができるかどうかは省略しています:http : //blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx クライアント経由で送信されたクエリでは、単純な一時テーブルを作成しました。 DECLARE @foo int; -- set by JDBC, unused but required to force a prepared statement SELECT 1 AS id INTO #tmp SELECT OBJECT_ID('tempdb..#tmp'); プロファイラーで、私は見ることができます: declare @p1 int set @p1=NULL exec sp_prepexec @p1 output,N'@P1 int',N'declare @foo INT = @P1 SELECT 1 …

3
DBテーブルでのSPIDの使用(テーブル変数の代わり)
予約に使用されるトランザクションデータベース... 私たちのベンダーは、#temptablesを@tablevariablesに置き換えるように依頼されました(コンパイルロックが重いため)。代わりに、SPIDを列として追加する実際のテーブルに置き換えて、ストアドプロシージャが適切な行でのみ機能するようにしました。 この操作方法にリスクはありますか?すべてのトランザクションが独自のトランザクション内に分離される前に...このテーブルを大量にロックしてしまうのではないかと心配しましたが、SQLは行レベルのロックを使用しているため、これ以上のロックは作成されないというのが彼らの意見です。 SQL Serverバージョン:2016 Enterprise-13.0.5216.0 CREATE TABLE dbo.qryTransactions ( ID int IDENTITY (0,1) NOT NULL CONSTRAINT pk_qryTransactions PRIMARY KEY CLUSTERED, spid int NOT NULL, OrderID int, ItemID int, TimeTransactionStart datetime, TimeTransactionEnd datetime, ...other fields ) CREATE INDEX idx_qryTransactions_spidID ON qryTransactions (spid, ID) INCLUDE (ItemID, OrderID, TimeTransactionStart, TimeTransactionEnd)

3
ストアドプロシージャは、それが格納されているデータベースを参照できますか?
複数のデータベースで、いくつかの変更を加えて複製されたストアード・プロシージャーがあるとします。また、別のデータベースで実行されている場合でも、ストアドプロシージャが格納されているデータベースを参照したいと思います。 現在のデータベースではなく、フルパス(..)を取得する方法、またはストアドプロシージャが格納されているデータベースを取得する方法はありますか?

1
ストアドプロシージャを更新するには「ダウンタイム」が必要ですか?(「定義変更」エラーによる)
ストアドプロシージャの更新は、ユーザーがシステムを積極的に使用しているときにできることだといつも思っていました。 しかし、私は現在、ストアドプロシージャの更新をテストしており、sprocへの長時間実行中の呼び出しが実行されている間に(呼び出しから4分以上)、sprocを更新しました。(別のウィンドウで別のクエリプランを試すことを計画していました。) 私が長期的なものに戻ったとき、私はこのエラーがありました: The definition of object 'MySprocName' has changed since it was compiled. このエラーは、sprocの定義が更新されると、アクティブに実行されているsprocが失敗することを示しているようです。(sprocが実行を開始すると、定義への変更にもかかわらず、残りの実行に対してその計画を使用すると思いました。) これは本当ですか?sprocの定義を更新するためにダウンタイムが必要ですか?

2
主キーを持つ「INTO」テーブルを作成する
たぶんこのコミュニティにとって私の問題は簡単ですが、私(単純なJavaプログラマー)にとってはそれは大きな問題です。 ますます多くのデータを含むBig DBがあります。したがって、外部データベース管理者は、一時テーブルに必要なデータを表示するジョブを作成しました。しかし、彼は主キーなしでテーブルを作成していました。私のJavaプロジェクトでこのテーブルを読みに行くと、エラーが発生します。 主キーが存在しないため、このテーブルを読み取ることができません。 この複雑なプロシージャの構造を変更せずに、自動インクリメンタル主キーを作成する可能性をプロシージャに挿入できますか? これは、ストアドプロシージャコードの始まりです。 USE [MYDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER Procedure [dbo].[spSchedula_Scadenzario] as begin drop table MYDB.dbo.tmpTable select aa.* into MYDB.dbo.tmpTable from (...) 前もって感謝します

2
複数のストアドプロシージャで同じコード
最近入社しましたが、多くのストアドプロシージャに同じコードセクションが繰り返し含まれていることに気づきました。発生したすべてのSPでそのコードの小さなセクションを変更する必要があったので、気が付きました:) これはかなり大きなコードの塊で、約30行です。コードはinsertステートメントの一部であり、基本的には4つのテーブルをWHERE/AND、SP間で実際に変更されない条件と一緒に結合します。以下のようになります。 ... ... FROM <TableOne> INNER JOIN <TableTwo> ON ... AND ..... AND ..... LEFT JOIN <TableThree> ON ... AND ..... AND ..... WHERE ..... AND ..... AND ..... AND MedicalPlanCode IN ('abc', 'def', 'ghi') SPからSPに変更される唯一の部分は値('abc'、 'def'、 'ghi')です。 また、これらの値の量が異なる場合があるため、一部のSPには2つの値があり、他のSPには5つの値があります。 私が考えるすべてのことは、コードのそのセクションを動的SQLに変更し、それが価値があるかどうかはわかりません。しかし、私のプログラマはこの状況を嫌っています。 なんらかのコードの再利用を実装する必要がありますか?ROIはありますか?私のオプションは何ですか?約100のストアドプロシージャを実行する必要があり、約1時間かかりました。 100個のSPは、20以上の異なるデータベースに分散しています。ビューを作成する権限があります。

4
完了する前にストアドプロシージャから応答を取得する方法
終了する前に、ストアドプロシージャから部分的な結果(単純な選択として)を返す必要があります。 それは可能ですか? はいの場合、それを行う方法は? そうでない場合、回避策はありますか? 編集:私は手順のいくつかの部分を持っています。最初の部分では、いくつかの文字列を計算します。追加の操作を行うために、手順の後半でそれらを使用します。問題は、呼び出し元が文字列をできるだけ早く必要とすることです。そのため、その文字列を計算してそれを(どういうわけか、たとえばselectから)返し、それから作業を続ける必要があります。発信者は、貴重な文字列をはるかに迅速に取得します。 呼び出し元はWebサービスです。

3
ストアドプロシージャを異なるユーザーが同時に実行できる場合は、一時テーブルを使用することをお勧めしますか?
ActiveGUIDからobjectGUIDを取得するストアドプロシージャに取り組んでいます。結果を一時テーブルに格納し、他のプロセスで使用するために出力パラメーターに値を返します。SPは、さまざまなストアドプロシージャ、およびWebアプリケーションのPHP、ASP Classic、ASP.Netから呼び出されます。 私はそれをここに読んだ(一時テーブルに関して): ストアドプロシージャ内で作成された場合、それらはストアドプロシージャの完了時に破棄されます。さらに、特定の一時テーブルのスコープは、それが作成されたセッションです。つまり、現在のユーザーにのみ表示されます。複数のユーザーが#TableXという名前の一時テーブルを作成でき、同時に実行されるクエリは互いに影響しません。ユーザーは自律型トランザクションのままであり、テーブルは自律型オブジェクトのままです。サンプルの一時テーブル名が「#」記号で始まっていることに気付くでしょう。 私は行ってもいいように思えますが、私が知らない落とし穴がないことを確認するためにいくつかのアドバイスを求めたかったのです。こちらがSPです。 前もって感謝します。 CREATE PROCEDURE stp_adlookup @user varchar(100), @objectGUID varbinary(256) OUTPUT AS SET NOCOUNT ON; DECLARE @qry char(1000) CREATE TABLE #tmp( objectGUID nvarchar(256) ) SET @qry = 'SELECT * FROM openquery(ADSI, '' SELECT objectGUID FROM ''''LDAP://mydomaincontroller.com'''' WHERE sAMAccountName = ''''' + @user + ''''' '')' INSERT INTO …

3
MySQLがグローバルルーチン(ストアドプロシージャや関数)を作成する可能性
どういうわけかグローバルに利用可能なルーチンを定義することは可能ですか?すべてのルーチンはデータベースのスコープ内で作成する必要があるようです。 (事前に発行せずにuse dbname)コンソールからルーチンを作成しようとすると、エラーが発生します。 ERROR 1046 (3D000): No database selected 同一のデータベースが大量にあり(データは異なります)、いくつかのテーブル名に対していくつかのトリガーを作成することが目標です。ただし、実行するルーチンは1つだけにしたいので、データベースごとにこれらのルーチンを作成する必要はありません(これらは同じなので、ルーチンは各データベースで同じように動作します)。

1
PL / pgSQLでテーブル型の変数を宣言する
クエリ結果を保持するためにPL / pgSQLで型tableの変数を宣言する方法があるかどうか疑問に思っていますか?たとえば、次のように表現するにはどうすればよいですか。 q1 = select * from foo; q2 = select * from bar; for t1 in q1: for t2 in q2: -- do something with t1 and t2 return next構文を調べましたが、それは戻り値しか処理できないようです。

3
SQL Serverストアドプロシージャの条件付きコンパイル
ショートバージョン: Visual Studio 2010のSQL Serverデータツールを使用して、SQL ServerデータプロジェクトのTSQLコードのチャンクを条件付きでコンパイルする方法はありますか? Visual Studio 2010でSQL Serverデータツールを使用して、実験的なSQL Server Expressデータベースで作業しています。物事がうまく機能する場合の最終的な宛先は、エンタープライズSQL Serverプラットフォームです。私の会社は多くのエンタープライズデータベースについても2008から2012への移行を進めているため、あるボックスに2008インスタンスと別のボックスに2012インスタンスの両方を持っています。 私が使用した他のプログラミング言語では、プリプロセッサディレクティブを使用すると、コードベースの一部を条件付きで簡単にコンパイルできます。これの最も一般的な用途は、制限されたセクションに異なるプラットフォームの異なるコードを含めること、またはリリースビルドからデバッグ出力コードを除外することです。 これらの両方は、私が取り組んでいるいくつかのストアプロシージャで非常に役立ちます。このようなものはありますか?sqlcmd展開中に変数を使用して特定の値を交換できることはわかっていますが、それを使用して後続のコードのチャンクを含めたり除外したりする方法を理解できません。 例: #IF $(DebugVersion) = 'True' -- A bunch of useful PRINTs and what not #ELSE SET NOCOUNT ON #ENDIF #IF $(SSVersion) = '2012' SET @pretty_date = FORMAT(@some_date, 'dddd, MMM dd, yyyy') #ELSE SET @pretty_date = …

1
ストアドプロシージャに対するMySQLユーザー権限
簡単なストアドプロシージャを作成しました。 mysql> CREATE FUNCTION hello (s CHAR(20)) -> RETURNS CHAR(50) DETERMINISTIC -> RETURN CONCAT('Hello, ',s,'!'); Query OK, 0 rows affected, 1 warning (0.00 sec) しかし、実行に失敗しました: mysql> SELECT hello('world'); ERROR 1370 (42000): execute command denied to user ''@'localhost' for routine 'test.hello' ユーザー名が空の文字列である可能性はありますか?ユーザーを作成して権限を付与するにはどうすればよいですか?データベース内のすべてのエンティティに対するすべての権限をユーザーに付与できますか?

2
存在する場合、DROPプロシージャがmysqldumpに含まれていない
次のコマンドを使用してのみ、ストアドプロシージャをダンプしています。 mysqldump --routines --no-create-info --no-data --no-create-db --skip-opt databasename -u username -p > outputfile.sql ただし、結果のダンプファイルには、各プロシージャ宣言の前にDROP PROCEDURE IF EXISTSは含まれていません。 ダンプクエリをダンプに追加するにはどうすればよいですか? ありがとうございました。

3
ストアドプロシージャを使用してデータを処理することと、検索後に関数にデータを供給することとでは、パフォーマンスが向上しますか?
タイトルはそれを要約します。私はPHPにかなり余裕があり、MySQLから取得した値を使用して必要なことを実行できますが、知識を広げるために、おそらくそれがロングラン。それらは同等ですか(最終的にはほぼ同じ量の処理が行われるため)、または一方が他方よりも明らかに有利な場合がありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.