Поскольку вы работаете на SQL Server, вы можете использовать функцию SCOPE_IDENTITY()
, чтобы безопасно получить последнее вставленное значение идентификатора в текущей области.
В документации говорится
SCOPE_IDENTITY (Transact-SQL)
Возвращает последнее значение идентификатора, вставленное в столбец идентификаторов в той же области. Область видимости — это модуль: хранимая процедура, триггер, функция или пакет. Таким образом, два оператора находятся в одной области, если они находятся в одной и той же хранимой процедуре, функции или пакете.
При использовании в двух отдельных тегах ColdFusion (<cfinsert>
с последующим <cfquery>
) это две партии, и SCOPE_IDENTITY()
больше не будет работать. Следовательно, операторы INSERT
и SELECT
должны быть частью одного и того же пакета. К сожалению, это не может быть достигнуто с помощью <cfinsert>
.
Вы сказали, что у вас много полей в сообщении формы, поэтому я бы сделал что-то вроде этого:
<cfset fieldNames = "all,relevant,field,names,from,http,post">
<cfset fieldTypes = "INTEGER,VARCHAR,VARCHAR,DATETIME,INTEGER,VARCHAR,VARCHAR">
<cfset fieldNullable = "false,true,true,true,false,true,false">
<cfset fieldCount = ListLen(fieldNames)>
<!--- default "" for any fields missing from the HTTP POST --->
<cfloop from="1" to="#fieldCount#" index="i">
<cfparam name="FORM.#ListGetAt(fieldNames, i)#" default="">
</cfloop>
<cfquery name="insert" datasource="#yourdatasource#">
INSERT YourTable (#fieldNames#)
VALUES (
<cfloop from="1" to="#fieldCount#" index="i">
<cfif i gt 1>,</cfif>
<cfset val = FORM[ListGetAt(fieldNames, i)]>
<cfset type = "CF_SQL_#ListGetAt(fieldTypes, i)#">
<cfset null = ListGetAt(fieldNullable, i) eq "true" and val eq "">
<cfqueryparam value="#val#" cfsqltype="#type#" null="#null#">
</cfloop>
)
SELECT SCOPE_IDENTITY() as NewId
</cfquery>
<cfdump var="#insert#">
person
Tomalak
schedule
21.04.2015
<cfinsert>
? Возможно, полезной альтернативой будет<cfquery>
с одним оператором INSERT для вставки данных и одним оператором SELECT для получения нового идентификатора. - person Tomalak   schedule 21.04.2015SELECT MAX(id)
будет возвращать одно и то же значение. - person Tomalak   schedule 21.04.2015SCOPE_IDENTITY
для решения этой конкретной проблемы. Другие системы БД используют другие функции. Итак, это зависит. - person Tomalak   schedule 21.04.2015<cfinsert>
или нет. Видите ли, если бы вы только ответили на два вопроса в моем первом комментарии... - person Tomalak   schedule 21.04.2015MAX(id)
используйтеSELECT SCOPE_IDENTITY() as NewId
в cfquery. - person Tomalak   schedule 21.04.2015SCOPE_IDENTITY
даже возвращает значение при таком использовании? - person Tomalak   schedule 21.04.2015cfinsert
.....никогда. - person Scott Stroz   schedule 21.04.2015