как узнать, что побежал из запроса upsert - PullRequest
0 голосов
/ 13 июня 2018

У меня есть запрос

<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 голосов
/ 14 июня 2018

Чтобы представить еще один вариант, SQL 2008+ также поддерживает MERGE для "upserts".Добавление предложения OUTPUT предоставит доступ к специальной переменной $action.Как следует из названия, оно будет указывать на фактически выполненное действие («вставить» или «обновить»).

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

Примечание: хотя из коробки параллелизм все еще остается проблемой с любым из методов.

0 голосов
/ 13 июня 2018

Я бы попробовал дать тегу cfquery аргумент результата и проверить, есть ли у этого результата идентификатор вставки:

Редактировать: использовал функцию, которая не вызвала бы <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>

(проверьте документацию , чтобы узнать, какой GENERATEDKEY лучше всего подходит для ваших целей)

...