6

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

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

更新 もともとアプリは CF 7 で開発されましたが、CF 7 は後で CF9 にアップグレードされ、現在は CF 11 を搭載したローカル マシンでデバッグしています。CF 7 が置き換えられたときにコードもアップグレードされたかどうかはわかりません。 CF 8、そしてCF 9で。プロファイラーで上記のSQLを生成すると思われるCFqueryは次のようになります。さらに、テーブル ProductItems には ID 列があり、データベースはトリガーを使用しておらず、CFquery タグは結果属性を使用していません。

<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>
4

1 に答える 1

7

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

注意:以降のバージョンでは実装が変更されている可能性があります。

コメントでbeloitdavisjaが言及したように、属性cfqueryを持つタグを探します。実行されたクエリに関する詳細を含む構造体です。CF8 では、生成されたレコード ID が key の下に返されます。それ以降のバージョンでは、データベースに依存しないバージョンの.resultResultIDENTITYCOLGENERATEDKEY

于 2015-10-20T17:27:03.173 に答える