6

Ich benutze SQL Server 2008 R2 Profiler, um ein Problem in einer ColdFusion 7-Anwendung zu debuggen - die von jemand anderem entwickelt wurde - unter Windows 7 mit SQL Server 2008 R2 als ein Backend. Die Anwendung verwendete ursprünglich MS Access 2003 als Back-End, das später in SQL Server 2008 R2 konvertiert wurde. Der Profiler zeigt die folgende SQL, die SCOPE_IDENTITY() verwendet, aber wenn ich das Anwendungsstammverzeichnis mit einem Suchprogramm suche, hat keine Datei die SCOPE_IDENTITY() -Funktion irgendwo in ihrer SQL-Abfrage verwendet. Die SQL Server-Datenbank für die App enthält keine gespeicherten Prozeduren, Sichten, Funktionen usw. Alle SQL-Abfragen sind eingebettete Abfragen in ColdFusion-Dateien. Wo dann Profiler wird immer SCOPE_IDENTITY() Funktion:SQL Server Profiler zeigt SCOPE_IDENTITY(), während ColdFusion-Code es in keiner Abfrage verwendet

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 Obwohl ursprünglich die App in CF entwickelt wurde 7, 7 CF später wurde CF9 aktualisiert und jetzt bin ich es auf dem lokalen Rechner debuggen, die hat CF 11. Ich weiß nicht, ob der Code auch aktualisiert wurde, als CF 7 durch CF 8 und dann durch CF 9 ersetzt wurde. Die CFquery, die das obige SQL im Profiler zu generieren scheint, sieht so aus. Außerdem sieht die Tabelle ProductItems eine Identitätsspalte haben, wird die Datenbank unter Verwendung keine Trigger und die cfquery-Tags sind nicht Attribut Ergebnis:

<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

Was ist der tatsächliche CF-Code für das INSERT oben? – Leigh

Antwort

7

Meine Vermutung wäre der CF-Server automatisch hinzufügt. Ich weiß, dass Sie gesagt haben, dass Sie MX7 verwenden, aber ... in ColdFusion 8 wurde ein neues Feature eingeführt, das die generierten IDs aus einfachen INSERT-Anweisungen abruft. In SQL Server wurde es durch Anfügen SELECT SCOPE_IDENTITY() an die INSERT Abfrage erreicht. Das hat zu der Zeit definitiv einige Probleme verursacht. Weitere Einzelheiten finden Sie unter:

NB: Die Umsetzung in späteren Versionen geändert.

Suchen Sie als beloitdavisja mentioned in the comments nach cfquery Tags mit dem Attribut result. Result ist eine Struktur, die Details zur ausgeführten Abfrage enthält. In CF8 wird die generierte Datensatz-ID unter dem Schlüssel IDENTITYCOL zurückgegeben. In späteren Versionen enthält es auch die datenbankunabhängige Version GENERATEDKEY.

+4

Das war meine Vermutung. @nam - Suchen Sie nach "cfquery" -Tags mit einem Attribut "result". Dieses Ergebnis hat einen Schlüssel 'GENERATEDKEY', wobei CF die eingegebene Identität – beloitdavisja

+2

@beloitdavisja - Yep speichert. Obwohl, IIRC der db-agnostische 'GENERATEDKEY' nicht in CF8 existierte. Es wurde später hinzugefügt. CF8, nur unterstützt 'GENERATED_KEY' für MySQL db's (@nam - beachten Sie den Unterstrich). – Leigh

+2

Vergessen Sie nicht, es ist auch zu überprüfen, dass Sie keine Trigger in der Datenbank definiert haben, da diese SQL ausführen können, die Sie in Ihrer CF-Codesuche nicht sehen. Wie oben jedoch ähnelt der Aufruf der gespeicherten Prozedur der vorbereiteten Anweisung, die der DB-Treiber für eine cfquery ausgeben soll, wenn cfqueryparam verwendet wurde, und SCOPE_IDENTITY() würde ab CF8 beim cfquery-Ergebnis erwartet Attribut wurde angegeben. Nur komisch zu sehen, wenn Sie wirklich noch auf CF7 sind. –