Как получить ID (PK) вновь созданной записи? - PullRequest
2 голосов
/ 19 января 2011

Учитывая таблицу:

CREATE TABLE [GENERIC_TABLE] (
  [RECORD_ID] [int] IDENTITY(1,1) NOT NULL,
  [SHORT_DESC] [varchar] (50) NULL,
 CONSTRAINT [PK_GENERIC_TABLE] PRIMARY KEY CLUSTERED
 ...

Я хочу вставить запись и получить значение нового RECORD_ID в переменную ColdFusion.

Как должен выглядеть мой CFQUERY?

(По общему признанию, это, вероятно, слишком простой вопрос. В своей защите я привык работать с Oracle, а не с SQL Server.)

Это для ColdFusion 8, но решения, не зависящие от версии, хороши.

Ответы [ 2 ]

12 голосов
/ 19 января 2011

Если вы установите атрибут результата в теге cfquery, первичный ключ возвращается без дополнительного SQL

<cfquery datasource="x" result="resultName">
INSERT INTO...
</cfquery>

<cfset newID = resultName.IDENTITYCOL />
  • MSSQL: IDENTITYCOL
  • Oracle: ROWID
  • Sybase: SYB_IDENTITY
  • Informix: SERIAL_COL
  • Mysql: GENERATED_KEY
1 голос
/ 11 марта 2011

По какой-то причине вы не можете использовать результат при дублировании строки.Вот решение, которое я нашел для этого случая.(Обратите внимание, синтаксис специфичен для SQL Server)

<cfquery name="dupRecord" datasource="#application.dsn#" result="dupResult">
    SET NOCOUNT ON;

    INSERT INTO dataProjects (DraftId,PublishStatus,ProjectName)
    SELECT 0,'draft',ProjectName
    FROM dataProjects
    WHERE projectId = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.projectId#">;

    SELECT SCOPE_IDENTITY() AS RecordID;
</cfquery>
<cfset dupProjectId = dupRecord.RecordID>
...