6

SQL Server 2008 R2プロファイラを使用して、ColdFusion 7アプリケーション(他の誰かによって開発されたもの) SQL Server 2008 R2をバックエンドとして使用します。このアプリケーションはもともとMS Access 2003をバックエンドとして使用していましたが、後でSQL Server 2008 R2に変換されました。プロファイラはSCOPE_IDENTITY()を使用している次のSQLを表示していますが、検索ユーティリティを使用してアプリケーションのルートディレクトリを検索すると、SQLクエリのどこでもSCOPE_IDENTITY()関数が使用されます。このアプリケーション用のSQL Serverデータベースには、ストアドプロシージャ、ビュー、関数などはありません。すべてのSQLクエリは、ColdFusionファイル内に埋め込まれたクエリです。ColdFusionコードがクエリで使用していないときにSCOPE_IDENTITY()を表示するSQL Server Profiler

declare @p1 int 
set @p1=11 
exec sp_prepexec @p1 output,N'@P1 datetimeoffset,@P2 varchar(8000),@P3 int,@P4 varchar(8000)',N'insert into ProductItems (item_date , item_description, item_type) 
values (
@P1 , 
@P2 , 
@P3 , 
) select SCOPE_IDENTITY()','2015-10-19 00:00:00 +00:00','Test description',1 
select @p1 

UPDATE もともとアプリはCF 7で開発されましたが、CF 7が後CF9にアップグレードされた、今私が持っているローカルマシン上でそれをデバッグしています:どこその後、プロファイラーはSCOPE_IDENTITY()関数を得ていますCF 11。CF 7をCF 8で置き換えた後にCF 9で置き換えたときにもコードがアップグレードされたのかどうかわかりません。 プロファイラで上記のSQLを生成していると思われるCFqueryのように見えます。また、テーブルProductItemsは、ID列を持っている、データベースには、任意のトリガを使用していない、とのcfqueryタグは、result属性を使用していない。

<cfquery name="addProductItems" datasource="#dtsource#"> 
    insert into Productitems (item_date,item_description,item_type) 
    values (
    <cfqueryPARAM value = "#item_dat#" CFSQLType = "CF_SQL_TIMESTAMP" null="#item_dat eq '-1'#">, 
    <cfqueryPARAM value = "#item_description#" CFSQLType = "CF_SQL_VARCHAR">, 
    <cfqueryPARAM value = "#item_type#" CFSQLType = "CF_SQL_INTEGER"> 
    ) 
</cfquery> 
+0

上記のINSERTの実際のCFコードは何ですか? – Leigh

答えて

7

私の推測では、CFサーバが自動的にそれを追加しているだろう。 ColdFusion 8ではMX7を使用していると言っていますが、単純なINSERTステートメントから生成されたIDを取得する新しい機能が導入されました。 SQL Serverでは、クエリにSELECT SCOPE_IDENTITY()を追加することで実現しました。それは間違いなくその時にいくつかの問題を引き起こしました。詳細については、以下を参照してください。

NB:実装はそれ以降のバージョンに変更された可能性があります。 beloitdavisja mentioned in the commentsとして

は、result属性を持つcfqueryタグを探します。 Resultは実行されたクエリの詳細を含む構造体です。 CF8では、生成されたレコードIDがキーIDENTITYCOLの下に返されます。それ以降のバージョンでは、データベースに依存しないバージョンのGENERATEDKEYも含まれています。

+4

これも私の推測でした。 @nam - 'result'属性を持つ' cfquery'タグを探します。この結果には、CFが挿入されたIDを格納するキー「GENERATEDKEY」があります。 – beloitdavisja

+2

@beloitdavisja - うん。しかし、IIRCはdbにとらわれない「GENERATEDKEY」はCF8には存在しませんでした。後で追加されました。 CF8は、MySQL DBの 'GENERATED_KEY'のみをサポートしています(@nam - アンダースコアに注意してください)。 – Leigh

+2

データベースに定義されているトリガーがないことをチェックする価値はあることを忘れないでください。トリガーがCFコード検索に表示されないSQLを実行できるためです。 しかし、ストアドプロシージャコールは、cfqueryを使用しているときにDBドライバがcfqueryのために出力することを期待しているプリペアドステートメントに非常によく似ており、cfqueryの結果が得られたときにはCF8以降にSCOPE_IDENTITY()属性が指定されています。 あなたが本当にまだCF7にいればそれを見るのはちょっと変です。 –

関連する問題