タグ付けされた質問 「functions」

関数は指定された作業を実行し、通常はパラメーターを入力として受け取ります。データベースに関しては、これらはSQLまたはデータベースベンダーに固有の場合があります。

1
EXPLAIN ANALYZEはplpgsql関数内のクエリの詳細を表示しません
PostgreSQL 9.3でPL / pgSQL関数を使用し、いくつかの複雑なクエリを内部で使用しています。 create function f1() returns integer as $$ declare event tablename%ROWTYPE; .... .... begin FOR event IN SELECT * FROM tablename WHERE condition LOOP EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return; END LOOP; ... INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ... UPDATE …

3
NVLは何を表していますか?
何のNVL略ですか?私は、クエリ結果からNULL以外の値を除外するために使用されるOracleおよびInformix(おそらく他のいくつかの場合もある)関数について話している(COALESCE他のデータベースと同様)。

2
関数/ストアドプロシージャの作成時のスキーマチェックの無効化
SQL Server 2008 R2データベースへの変更を実行するプロセスを自動化しようとしています。配置したプロセスは、ストアドプロシージャと関数を削除して再作成し、スクリプトを実行してテーブル/列/データを変更します。残念ながら、スクリプトの1つでは、最初に機能の1つを配置する必要があります。しかし、最初にテーブル/列/データ変更スクリプトから追加される列に依存するため、最初にすべてのストアドプロシージャ/関数の変更を実行することはできません。 SQL Serverが関数/ SPの定義で使用される列を検証せずにストアドプロシージャと関数を実行できるかどうか疑問に思っていましたか?探してみましたが、これを有効にする条件またはコマンドが見つかりませんでした。

4
PostgreSQL 9.6の列の削除とCTEを使用したSQL関数への副作用
3列(A、B、Dなど)のテーブルがあり、新しい列を導入しなければならなかった場合、Dの現在の位置を置き換えるためにCと言います。次の方法を使用します。 CおよびD2として2つの新しい列を導入します。 Dの内容をD2にコピーします。 Dを削除します D2の名前をDに変更します。 新しい順序は、A、B、C、およびDです。 (これまでのところ)問題が発生しなかったため、これは正当な慣行だと思いました。 しかし、今日、同じテーブルでステートメントを実行する関数が次のエラーを返したときに問題に遭遇しました。 table row type and query-specified row type do not match そして次の詳細: Query provides a value for a dropped column at ordinal position 13 私はPostgreSQLを再起動して、こことここでVACUUM FULL提案されているように最後に関数を削除して再作成しようとしましたが、これらの解決策は機能しませんでした(システムテーブルが変更された状況に取り組むことを除いて)。 非常に小さなデータベースで作業する余裕があったので、エクスポートし、削除してから再インポートしました。これにより、機能に関する問題が修正されました。 ここに見られるように、システムテーブルを変更する(pg_attributeなどで手を汚す)ことによって、列の自然な順序をいじってはならないという事実を知っていました。 Postgresの列の自然な順序を変更することは可能ですか? 私の関数によってスローされたエラーから判断すると、私のメソッドで列の順序をシフトすることもまたノーであることがわかりました。誰が私がやっていることも間違っている理由についていくつかの光を当てることができますか? Postgresバージョンは9.6.0です。 関数は次のとおりです。 CREATE OR REPLACE FUNCTION "public"."__post_users" ("facebookid" text, "useremail" text, "username" text) …

2
スカラー値の関数に選択ではなく実行権限が必要なのはなぜですか?
スカラー値関数の場合、選択だけでなく実行をユーザーに許可しなければならないのはなぜだろうか? 一方、テーブル値関数は、選択権限またはdb_datareaderメンバーシップのみで問題なく機能します。 ここでより明確にするのは私の例です:データベースへの読み取り専用権限を持つユーザーが必要です。という名前のユーザーを作成し、メンバーシップtestUserを付与しdb_datareaderます。次に、というテーブル値関数を作成しましたfn_InlineTable。そしてすべてが素晴らしいです。testUserこのSQLを終日実行します select * from dbo.fn_InlineTable その後、スカラー関数が必要なので、というスカラー関数を作成しましたfn_ScalarTest。 testUserこのSQLを実行できません Select dbo.fn_ScalarTest(1) 当然のことながら、実行するための "testUser"アクセス許可を与えていないためfn_ScalarTestです。 私の質問は次のとおりです:このリンクに基づいて/programming/6150888/insert-update-delete-with-function-in-sql-server、FUNCTIONデータベースの状態を変更するアクションを実行するために使用することはできません。では、実行許可ではなく、同じ「SELECT」許可でスカラー関数を使用させないのはなぜですか? 私の質問が理にかなっていることを願っています。ありがとうございました。

3
存在しない場合は、コードによって新しい関数を作成します
データベースにスクリプトで新しい関数を作成したい。スクリプトコードは次のとおりです。 IF Exists(Select * From sys.sysobjects A Where A.name =N'fn_myfunc' and xtype=N'FN') return; CREATE FUNCTION fn_myfunc () returns varchar(10) AS Begin ... End しかし、上記のスクリプトを実行すると、SQL Serverはエラーを返します。 'CREATE FUNCTION' must be the first statement in a query batch.

1
PostgreSQLでaes-encryptionを使用する方法は?
次のステートメントを使用してaes暗号化を試みました。 SELECT encrypt('test', 'key', 'aes'); うまくいきましたが、値を解読できません。それをデータ型byteaのフィールドに挿入しましたが、それが正しい方法であったかどうかはわかりません。 SELECT decrypt(pw, 'key', 'aes') FROM table WHERE ID = 1; 私にエラーを与えます エラー:関数decrypt(bytea、unknown、unknown)は存在しません LINE 1:SELECT decrypt(pw、 'key'、 'aes')FROM tabelle WHERE ID = 7; ^ ヒント:指定された名前と引数のタイプに一致する関数はありません。明示的な型キャストを追加する必要がある場合があります。 つまり、encrypt()は既存の関数であり、decrypt()ではないということですか?aesで暗号化された値を他にどのように取得できますか?


2
Setベースのアルゴリズム/ UDFを実装する方法
800K行38列のテーブルのすべての行に対して実行する必要があるアルゴリズムがあります。このアルゴリズムはVBAに実装されており、一部の列の値を使用して他の列を操作する一連の計算を実行します。 現在、Excel(ADO)を使用してSQLをクエリし、クライアント側カーソルでVBAを使用して、すべての行をループでアルゴリズムを適用しています。動作しますが、実行に7時間かかります。 VBAコードは非常に複雑であるため、T-SQLに再コーディングするのは非常に手間がかかります。 可能なルートとしてのCLR統合とUDFについて読みました。また、データベースに近づけるためにSSISスクリプトタスクにVBAコードを配置することも考えましたが、このタイプのパフォーマンスの問題に対する専門的な方法論が存在することは確かです。 理想的には、並列セットベースの方法で、できるだけ多くの行(すべて?)に対してアルゴリズムを実行できるようになります。 この種の問題で最高のパフォーマンスを得る方法に大きく依存するヘルプ。 -編集 コメントをありがとう、私はMS SQL 2014 Enterpriseを使用しています。詳細は次のとおりです。 このアルゴリズムは、時系列データの特性パターンを見つけます。アルゴリズム内の関数は、多項式の平滑化、ウィンドウ処理を実行し、入力基準に基づいて関心領域を見つけ、多数の値といくつかのブール結果を返します。 私の質問は、実際のアルゴリズムよりも方法論に関するものです。一度に多くの行で並列計算を実現したい場合、私のオプションは何ですか。 多くの作業が可能ですが、T-SQLへの再コード化が推奨されますが、アルゴリズム開発者はVBAで作業し、頻繁に変更されるため、T-SQLバージョンとの同期を保ち、すべてを再検証する必要があります変化する。 T-SQLはセットベースの関数を実装する唯一の方法ですか?

5
PostgreSQLデータベース内のすべてのオブジェクトの所有者を同時に設定する方法はありますか?
/programming/1348126/modify-owner-on-all-tables-simultaneously-in-postgresqlは、テーブルやその他のオブジェクトを特定のユーザーに変更するいくつかの気の利いた方法を説明します。提案は、私が作成した関数を無視するようです。 関数を含む、データベース内のすべてのオブジェクトの所有者をリセットするかなり簡単な方法はありますか?手作業で行うことは非常に望ましくありません。

1
SQL Server監査データからスカラー値のユーザー定義関数の使用を除外する方法
データベースに対するすべての実行アクションを監査するデータベース監査仕様を持つSQL Serverデータベースがあります。 CREATE DATABASE AUDIT SPECIFICATION [dbAudit] FOR SERVER AUDIT [servAudit] ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public]) 一部のクエリは、結果セットのすべての行に対してスカラー関数の使用を監査ログに書き込むことがわかっています。これが発生すると、ログがETLで最終的な休憩場所に達する前にログがいっぱいになり、ログにギャップが生じます。 残念ながら、コンプライアンス上の理由により、すべてのEXECUTEステートメントの監査を停止することはできません。 この問題へのアプローチについて最初に考えたのはWHERE、サーバー監査の句を使用してアクティビティを除外することです。コードは次のようになりました。 WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' ) 残念ながら、SQL ServerはリレーショナルIN演算子を許可しません(おそらく、監査ログに書き込む必要があるたびにクエリを実行したくないためです)。 私たちは、どのハードコードストアドプロシージャ書き込みを避けたいobject_idにWHERE句が、それは、この問題にアプローチする最良の方法で私たちの現在の考え方です。考慮すべき代替アプローチはありますか? 再帰CTEでスカラー関数が使用されている場合、結果セット内のすべての行の監査ログにクエリが書き込まれることに気付きました。 ベンダーが提供するいくつかのスカラー値関数がありますが、それらを削除したり、代替データベースに移動したりすることはできません。

3
並列性を妨げない方法でユーザー定義のスカラー関数をエミュレートします
クエリに特定のプランを使用するようにSQL Serverをだます方法があるかどうかを確認しようとしています。 1.環境 異なるプロセス間で共有されるデータがあるとします。したがって、多くのスペースをとるいくつかの実験結果があるとします。その後、各プロセスについて、使用する実験結果の年/月を特定します。 if object_id('dbo.SharedData') is not null drop table SharedData create table dbo.SharedData ( experiment_year int, experiment_month int, rn int, calculated_number int, primary key (experiment_year, experiment_month, rn) ) go これで、すべてのプロセスについて、テーブルにパラメーターが保存されました if object_id('dbo.Params') is not null drop table dbo.Params create table dbo.Params ( session_id int, experiment_year int, experiment_month int, …

1
クエリでスカラーUDFを一度だけ評価するにはどうすればよいですか?
スカラーUDFの結果に対してフィルタリングする必要があるクエリがあります。クエリは単一のステートメントとして送信する必要があるため(UDF結果をローカル変数に割り当てることができません)、TVFを使用できません。スカラーUDFによって引き起こされるパフォーマンスの問題を認識しています。これには、計画全体を連続的に実行すること、過剰なメモリ許可、カーディナリティー推定の問題、インライン化の欠如が含まれます。この質問については、スカラーUDFを使用する必要があると想定してください。 UDF自体は呼び出すのにかなり費用がかかりますが、理論的には、関数を一度計算するだけで済むように、オプティマイザーによってクエリを論理的に実装できます。この質問の非常に単純化された例をモックアップしました。次のクエリは、マシンで実行するのに6152ミリ秒かかります。 SELECT x1.ID FROM dbo.X_100_INTEGERS x1 WHERE x1.ID >= dbo.EXPENSIVE_UDF(); クエリプランのフィルター演算子は、関数が行ごとに1回評価されたことを示しています。 DDLおよびデータ準備: CREATE OR ALTER FUNCTION dbo.EXPENSIVE_UDF () RETURNS INT AS BEGIN DECLARE @tbl TABLE (VAL VARCHAR(5)); -- make the function expensive to call INSERT INTO @tbl SELECT [VALUE] FROM STRING_SPLIT(REPLICATE(CAST('Z ' AS VARCHAR(MAX)), 20000), ' '); RETURN 1; …

3
シリーズから各日付をカバーする日付の範囲の数を数える最速の方法
次のようなテーブル(PostgreSQL 9.4)があります。 CREATE TABLE dates_ranges (kind int, start_date date, end_date date); INSERT INTO dates_ranges VALUES (1, '2018-01-01', '2018-01-31'), (1, '2018-01-01', '2018-01-05'), (1, '2018-01-03', '2018-01-06'), (2, '2018-01-01', '2018-01-01'), (2, '2018-01-01', '2018-01-02'), (3, '2018-01-02', '2018-01-08'), (3, '2018-01-05', '2018-01-10'); 次に、指定された日付と種類dates_rangesごとに、各日付の行数を計算します。ゼロはおそらく省略できます。 望ましい結果: +-------+------------+----+ | kind | as_of_date | n | +-------+------------+----+ | 1 | …

2
副作用のある標準SQL関数はありますか?
SQL標準は副作用のある関数を定義していますか? たとえば、ファイルに書き込むための関数や、次のような場合にテーブルの特定の列の値を更新する関数がありますか? SELECT myfunction(params...); これらを時々見たことがありますが、SQL標準が同じことをしているのかどうか知りたいだけです。 *これは特にPostgreSQLに関する質問ではありません。私はPostgreSQLで見られる副作用の例のみを使用しています。

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