如何从 upsert 查询中知道 运行
how to know what ran from upsert query
我有一个问题
<cfquery name="qryTemp" datasource="someDSN">
if not exists (select someID from tempTable where someID = 20)
insert into tempTable (someID, colA, colB) values (1,2,3)
else
update tempTable set
colA = 2, colB =3
where someID = 1
</query>
有没有标识符可以指出是插入还是更新?如果有帮助,我可以将结果属性添加到查询中。
我会尝试给 cfquery
标签一个结果参数,并检查该结果是否有插入 ID:
编辑:使用了不会使 <cfif>
.
崩溃的函数
<cfquery name="qryTemp" datasource="someDSN" result="local.results">
if not exists (select someID from tempTable where someID = 20)
insert into tempTable (someID, colA, colB) values (1,2,3)
else
update tempTable set
colA = 2, colB =3
where someID = 1
</query>
<cfif structKeyExists(local.results, 'GENERATEDKEY')>
Do your stuff here...
</cfif>
(检查 Documentation 以查看哪个 GENERATEDKEY
最适合您的目的)
只是为了提供另一个选项,SQL 2008+ 还支持 MERGE 用于 "upserts"。添加 OUTPUT 子句将提供对特殊 $action
变量的访问。顾名思义,它将指示实际执行的操作("insert" 或 "update")。
<cfquery name="qryTemp" datasource="#someDSN#">
MERGE INTO tempTable tmp
USING ( VALUES ( 1, 2, 3 ))
AS data (someID, colA, colB)
ON data.someID = tmp.someID
WHEN MATCHED THEN
UPDATE SET tmp.ColA = data.ColA
, tmp.ColB = data.ColB
WHEN NOT MATCHED THEN
INSERT (someID, colA, colB)
VALUES (data.someID, data.colA, data.colB)
OUTPUT inserted.someID AS ModifiedID
, $action AS Action;
</cfquery>
<!--- Demo: Was an insert or update peformed? --->
<cfif qryTemp.Action eq "INSERT">
ID inserted = <cfoutput>#qryTemp.ModifiedID#</cfoutput>
<cfelse>
ID updated = <cfoutput>#qryTemp.ModifiedID#</cfoutput>
</cfif>
注意:虽然开箱即用,concurrency is still an issue 可以使用任何一种方法。
我有一个问题
<cfquery name="qryTemp" datasource="someDSN">
if not exists (select someID from tempTable where someID = 20)
insert into tempTable (someID, colA, colB) values (1,2,3)
else
update tempTable set
colA = 2, colB =3
where someID = 1
</query>
有没有标识符可以指出是插入还是更新?如果有帮助,我可以将结果属性添加到查询中。
我会尝试给 cfquery
标签一个结果参数,并检查该结果是否有插入 ID:
编辑:使用了不会使 <cfif>
.
<cfquery name="qryTemp" datasource="someDSN" result="local.results">
if not exists (select someID from tempTable where someID = 20)
insert into tempTable (someID, colA, colB) values (1,2,3)
else
update tempTable set
colA = 2, colB =3
where someID = 1
</query>
<cfif structKeyExists(local.results, 'GENERATEDKEY')>
Do your stuff here...
</cfif>
(检查 Documentation 以查看哪个 GENERATEDKEY
最适合您的目的)
只是为了提供另一个选项,SQL 2008+ 还支持 MERGE 用于 "upserts"。添加 OUTPUT 子句将提供对特殊 $action
变量的访问。顾名思义,它将指示实际执行的操作("insert" 或 "update")。
<cfquery name="qryTemp" datasource="#someDSN#">
MERGE INTO tempTable tmp
USING ( VALUES ( 1, 2, 3 ))
AS data (someID, colA, colB)
ON data.someID = tmp.someID
WHEN MATCHED THEN
UPDATE SET tmp.ColA = data.ColA
, tmp.ColB = data.ColB
WHEN NOT MATCHED THEN
INSERT (someID, colA, colB)
VALUES (data.someID, data.colA, data.colB)
OUTPUT inserted.someID AS ModifiedID
, $action AS Action;
</cfquery>
<!--- Demo: Was an insert or update peformed? --->
<cfif qryTemp.Action eq "INSERT">
ID inserted = <cfoutput>#qryTemp.ModifiedID#</cfoutput>
<cfelse>
ID updated = <cfoutput>#qryTemp.ModifiedID#</cfoutput>
</cfif>
注意:虽然开箱即用,concurrency is still an issue 可以使用任何一种方法。