Den*_*one 6 sql-server coldfusion cfquery primary-key
当我使用CFINSERT表单时,数据被插入到我的数据库中,因为字段名称与列名称匹配.
我的问题:如何使用CFINSERT获取我刚刚添加的行的主键?
我知道我不能使用类似于标准的"Result ='variable'",cfquery那么获得主键的最佳方法是什么?
如果我在我的cfinsert之后直接运行以下查询,它应该返回以前的PK:
<cfquery name="getID" datasource="#mydsn#" result="#result#">
select Max(id) as NewID from myTablename;
</cfquery>
Run Code Online (Sandbox Code Playgroud)
这是完成我想要做的最好的方法吗?
处理这个问题的最佳方法是从generatedKey查询的结果结构中获取主键。
<cfquery name="myQuery" result="queryResult" datasource="#myDSN#">
INSERT INTO some_table
(column_one)
VALUES
(<cfqueryparam value="#stringForColOne#" cfsqltype="CF_SQL_VARCHAR">)
</cfquery>
<cfoutput>
Generated Key from SQL Insert = #queryResult.generatedKey#
</cfoutput>
Run Code Online (Sandbox Code Playgroud)
请参阅https://wikidocs.adobe.com/wiki/display/coldfusionen/cfquery#cfquery-Usage
由于您使用的是 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#">
Run Code Online (Sandbox Code Playgroud)