如何知道从upsert查询运行的内容

时间:2018-06-13 13:12:17

标签: coldfusion coldfusion-2016

我有一个查询

<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> 

是否有任何标识符可以指出它是插入还是更新?如果可以帮助,我可以将结果属性添加到查询中。

2 个答案:

答案 0 :(得分:3)

我会尝试给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最适合您的目的)

答案 1 :(得分:1)

为了呈现另一个选项,SQL 2008+还支持{34}用于&#34; upserts&#34;。添加OUTPUT子句将提供对特殊$action变量的访问。顾名思义,它将指示实际执行的操作(&#34;插入&#34;或&#34;更新&#34;)。

<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>

注意:虽然开箱即用,MERGE使用任何一种方法。