2008-09-16 40 views
1

私たちのコードジェネレータが行うことをエミュレートするために、SET FMTONLY ONを使用してストアドプロシージャを実行しています。しかし、私はまだを取得しているので、このように実行すると結果はキャッシュされているようです。エラーが発生しました。これは、SET FMTONLY ONを使わないでprocを実行しても起こります。SET FMTONLY ONの問題

ここで何が起こっているのか教えていただけますか?

+2

当たり前に動作しないはずです!私はFMTONLYをONにしたままにしていましたが、DDLで何もしていないと何も効果がなかったようです。 – ProfK

答えて

1

いくつかのステートメントはまださえSET FMTONLY ONで、実行されます。 「変換に失敗しました」というエラーは、ストアドプロシージャ内のset variableステートメントのような単純なものからのものです。たとえば、これは最初のクエリのメタデータを返しますが、それは最後の文を実行したときに例外をスロー:

SET FMTONLY on 

select 1 as a 

declare @a int 
set @a = 'a' 

ドロップ手順を実行するためとして、それは私には新しいものです。 SQL Serverはシステムテーブルを使用して実行するオブジェクトを決定します。したがって、実行計画がそのオブジェクトに対してキャッシュされているかどうかは関係ありません。ドロップすると、システムテーブルから削除され、決して実行可能ではありません。プロシージャを実行する直前にsysobjects(またはsys.objects)を照会してください。私はあなたがそれを落としていないことが分かると思います。

0
  1. これはクライアント側エラーのようです。 SQL Management Studioを実行しているときに同じメッセージが表示されますか?

  2. 別のスキーマ/ユーザーが所有する同じ名前のプロシージャがないことを確認しましたか?

0

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 
関連する問題