私たちのコードジェネレータが行うことをエミュレートするために、SET FMTONLY ONを使用してストアドプロシージャを実行しています。しかし、私はまだを取得しているので、このように実行すると結果はキャッシュされているようです。エラーが発生しました。これは、SET FMTONLY ONを使わないでprocを実行しても起こります。SET FMTONLY ONの問題
ここで何が起こっているのか教えていただけますか?
私たちのコードジェネレータが行うことをエミュレートするために、SET FMTONLY ONを使用してストアドプロシージャを実行しています。しかし、私はまだを取得しているので、このように実行すると結果はキャッシュされているようです。エラーが発生しました。これは、SET FMTONLY ONを使わないでprocを実行しても起こります。SET FMTONLY ONの問題
ここで何が起こっているのか教えていただけますか?
いくつかのステートメントはまださえSET FMTONLY ON
で、実行されます。 「変換に失敗しました」というエラーは、ストアドプロシージャ内のset variable
ステートメントのような単純なものからのものです。たとえば、これは最初のクエリのメタデータを返しますが、それは最後の文を実行したときに例外をスロー:
SET FMTONLY on
select 1 as a
declare @a int
set @a = 'a'
ドロップ手順を実行するためとして、それは私には新しいものです。 SQL Serverはシステムテーブルを使用して実行するオブジェクトを決定します。したがって、実行計画がそのオブジェクトに対してキャッシュされているかどうかは関係ありません。ドロップすると、システムテーブルから削除され、決して実行可能ではありません。プロシージャを実行する直前にsysobjects(またはsys.objects)を照会してください。私はあなたがそれを落としていないことが分かると思います。
これはクライアント側エラーのようです。 SQL Management Studioを実行しているときに同じメッセージが表示されますか?
別のスキーマ/ユーザーが所有する同じ名前のプロシージャがないことを確認しましたか?
DDL文は解析されますが、接続でSET FMTONLY ONが実行された場合は実行時に無視されます。したがって、FMTONLYがONのときにproc、tableなどを削除すると、その文は解析されますが、アクションは実行されません。
は、このレコードが挿入された--validate
CREATE TABLE TestTable (Column1 INT, Column2 INT)
--insert 1レコード
INSERT INTO TestTable (Column1, Column2)
VALUES (1,2)
にテストする
SET FMTONLY OFF
--createテーブルを確認してみ
SELECT * FROM TestTable
にのみON
SET FMTONLY ON
--columnsが返されるに書式を設定し、ないデータ
SELECT * FROM TestTable
DROP TABLE TestTable
ON FMTONLYと--performのDDL文--now - - FMTONLYをもう一度オフにする
SET FMTONLY OFF
--The上記の表は削除されましたので、これは
SELECT * FROM TestTable
DROP TABLE TestTable
SELECT * FROM TestTable
当たり前に動作しないはずです!私はFMTONLYをONにしたままにしていましたが、DDLで何もしていないと何も効果がなかったようです。 – ProfK