
SQLServer2005を使用しています。
今、ユーザー定義関数を作成していて、クエリアナライザにて動作を検証しています。
ユーザー定義関数内で、sp_executesqlを実行しようとすると、
「サーバー : メッセージ 557、レベル 16、状態 2、プロシージャ F_GET_DAY、行 26 関数内から実行できるのは関数と拡張ストアド プロシージャだけです。」
というエラーが出ます。
sp_executesqlは、マスターデータベースの拡張プロシージャに位置づけられているので、実行可能だと思ったのですが・・・。
同じく、マスターデータベースの拡張プロシージャにである「sp_oacreate」の実行を試してみると、関数内で実行できました。
sp_executesqlは、関数内では実行できないのでしょうか。
No.3ベストアンサー
- 回答日時:
ANO.1です。
>>スカラ値関数ではOKのようです(補足で頂いたSQLもOKです)。
>ここのところを再度ご教授願えないでしょうか。
なるほど納得です。私はEXECUTEしてました。
例:
DECLARE @ret int
EXEC @ret = dbo.F_GET_DAY
通常、関数は、SELECTでも使用しますので、
そのあたり検証すべきでした。
申し訳ありません。
SELECT, PRINTともNGで、EXECUTE はOKでした。
拡張ストアドの種類や関数の実行の仕方など、
SQLServerが判断して実行可否を決定しているのですね。
で、その判断基準は明記されておらず
(関数の設計基準はありますが)、
実行してみないことにはわからないようです。
またまた勉強になりました。
ご回答、ありがとうございます!
>SQLServerが判断して実行可否を決定しているのですね。
>で、その判断基準は明記されておらず
>(関数の設計基準はありますが)、
>実行してみないことにはわからないようです。
エラーメッセージでは可能なような気がしてしまったので、どうなのかな、と思いましたが、SELECT、PRINTの場合はやはりNGなのですね、、、
しかし、この辺の判断基準は明確にしていただきたいものですね。
ありがとうございます、ファンクションの奥深さを教えていただきました☆
No.2
- 回答日時:
ANo.1です。
私の理解不足でした。現象が確認できました。
テーブル値関数内で、「sp_executesql」を実行すると、
「関数内から実行できるのは・・」エラーが発生しました。
作成されているユーザー関数はテーブル値関数ではないですか?
スカラ値関数ではOKのようです(補足で頂いたSQLもOKです)。
ヘルプには関数内で「sp_executesql」は実行可能であるかのように
書かれております。
テーブル値関数で、NGなのかは、明記されておりませんでした。
(ストアドでSELECTの結果を返すときに、
ストアド内で「EXECUTE」を利用していない場合は、
関数に置き換え可能であるとの記述は見つけましたが。)
おそらく関数とは、
1.スカラ関数は値を返す。
2.テーブル値関数はビューでは実現できない形で結果を得る、
すなわち、パラメータを渡せたり、テーブル変数に対して
更新などの処理を行い、結果を返す。
もので、それ以上のことを行うときは、
エラーが発生するかもしれないので、
ストアドプロシージャを利用しましょう
ということになるのでしょうか。
勉強になりました。
この回答への補足
ご回答ありがとうございます!
なるほど、テーブル値関数ではNGなのですね、ヘルプではそこまで読み取れないとのこと、大変貴重なご意見いただきました。ありがとうございます。
しかし、私の場合はそれ以前の問題のようです、、、
私が今回使用しているのはスカラ値関数です。
1.ファンクション作成
CREATE FUNCTION F_test ()
RETURNS int
AS
BEGIN
DECLARE @SQLNVARCHAR(4000)
--SQL作成
SET @SQL = N'INSERT INTO T_CAL VALUES (''2006/12/04'',1)'
--実行
EXECUTE sp_executesql @SQL
--戻り値
RETURN (1)
END
2.クエリアナライザより、実行
select dbo.F_test()
とした場合、「サーバー : メッセージ 557、レベル 16、状態 2、プロシージャ F_test、行 10
関数内から実行できるのは関数と拡張ストアド プロシージャだけです。」
というエラーが発生します。
>スカラ値関数ではOKのようです(補足で頂いたSQLもOKです)。
ここのところを再度ご教授願えないでしょうか。
No.1
- 回答日時:
関数内からsp_executesqlは実行できます。
sp_executesqlに渡している文字列内に実行できないコマンドがあるとかではないですか?
ログインユーザーの権限とsp_executesqlに渡している文字列の内容を可能な限り教えて頂けますか?
この回答への補足
tasokarewa様
ご意見ありがとうございます!
1.sp_executesqlに渡している文字列の内容は、テスト的に簡単なINSERT文としています。
SET @SQL = N'INSERT INTO T_CAL VALUES (''2006/12/04'',1)'
EXECUTE sp_executesql @SQL
上記は、プロシージャでは実行可能ですが、ファンクションではエラーがでます。
2.ログインユーザの権限というところは怪しいのですが、、、
・クエリアナライザでは、「おそらく全てのデータベースに接続できる」と思っているsaユーザにて接続しています。
・実行可能なプロシージャ、実行不可能なファンクションとも、所有者dboで作成されています。
・・・補足回答になっているでしょうか、、、
関数内からsp_executesqlを実行している例がネット上、どうしても見つかりません。(何れもストアドプロシージャか無名プロシージャです。。。)
できれば、実行可能なファンクションサンプルを教えていただけないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- 数学 複素関数と実関数のテーラー展開の違いについて 1 2022/08/09 06:18
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- 新卒・第二新卒 就活 新卒 自己PR 強み 添削お願いします。 以下の文章で自己PRを書いてみたのですが、どこが競争 3 2023/02/25 21:27
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Excel(エクセル) Excel ユーザー定義で変換したセルについて 3 2023/02/04 01:25
- Word(ワード) Word 2016のマクロを Word 2021のWordでキー動作させたい 3 2023/04/12 16:14
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
このQ&Aを見た人はこんなQ&Aも見ています
-
【Transact-sql】 execの結果をoutputパラメータに持たせたい
SQL Server
-
SQLで列名を変数にできないでしょうか
SQL Server
-
MS SQLServer のSQLで文字列の前にN:
その他(データベース)
-
-
4
テーブル列数とデータファイル列数の違うbcpインサートをしたい
SQL Server
-
5
ビューで引数を使いたい
SQL Server
-
6
復旧中のデータベースについて
SQL Server
-
7
テーブル名が可変の場合のクエリの書き方
MySQL
-
8
GROUP BYを行った後に結合したい。
Oracle
-
9
sqlserverにはグループ集計のfirstとlastがありません??
SQL Server
-
10
列名に変数を使うことはできないのでしょうか?
SQL Server
-
11
SQLサーバから、項目の属性(型)を取得したいのですが・・・
SQL Server
-
12
ストアドをまたがるローカル一時テーブル
SQL Server
-
13
SQLServer2005のストプロでxp_cmdshellを使いvbsファイルを実行できない
SQL Server
-
14
ビューのソートについて
SQL Server
-
15
ビューにインデックスを設定できませんか?
SQL Server
-
16
SQLServerのselect文でデータ数1万くらいのDBから
SQL Server
-
17
SQLServerで文字列の末尾からある位置で取出
SQL Server
-
18
sqlserverで集計結果をUPDATEしたいです
SQL Server
-
19
BULK INSERT時のNull許容について
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel-VBAの「しばらくお待ちく...
-
sqlcmdでクエリの実行結果をバ...
-
バッチでのSQL実行結果の分岐処...
-
ストアドプロシージャーでバッ...
-
Excelフィルタ抽出で「検索して...
-
AccessのDAO.ExecuteとDoCmd.Ru...
-
続・SQLServerユーティリティに...
-
静的SQL、動的SQL?
-
IDENTITY列を持つテーブルへBCP...
-
WHERE句の?
-
データベース SQL のセッショ...
-
100万件レコードdelete
-
バッチからSQLCMDを実行する方法
-
同じSQL文で速度がだいぶ違う
-
accessでSQLをファイルから実行...
-
オラクルインストールユーザ以...
-
バッチからメンテナンスプラン...
-
SQLServer2005のストプロでxp_c...
-
UPDATE時のSETの実行順について
-
アクションクエリが実行できない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel-VBAの「しばらくお待ちく...
-
ユーザー定義関数内でのsp_exec...
-
AccessのDAO.ExecuteとDoCmd.Ru...
-
SQLサーバーのジョブでのexeフ...
-
ストアドの速度がクエリの30...
-
SQLCMDにて教えていただきたい...
-
SQLServer2005のストプロでxp_c...
-
SQL-Loaderが動かないです。
-
Excelフィルタ抽出で「検索して...
-
【Oracle】ADOでSELECT * FROM ...
-
sqlcmdでクエリの実行結果をバ...
-
バッチからSQLCMDを実行する方法
-
SQLServerのジョブからバッチを...
-
サーバーと実行端末が違う場合...
-
Accessからストアドプロシジャ...
-
オラクルインストールユーザ以...
-
バッチでのSQL実行結果の分岐処...
-
IDENTITY列を持つテーブルへBCP...
-
100万件レコードdelete
-
UPDATE時のSETの実行順について
おすすめ情報