2012-06-18 13 views
5

Tengo una tabla que necesito actualizar donde todas las columnas se pasan opcionalmente a un método.Actualizar consulta cuando todos los campos son opcionales

Estoy usando ColdFusion para verificar si se pasó cada columna y agregarla a la consulta de actualización.

¿Cuál es la mejor manera de hacerlo? No siempre puedo actualizar el campo user_id porque es un campo de identidad. ¿Hay algo similar a establecer 1 = 1 como tengo abajo que funcione? El problema es solo con las comas que causan errores de sintaxis.

Gracias por cualquier ayuda.

update users 
set 1 = 1 
    <cfif len(arguments.userType)>,user_type = #arguments.userType#</cfif> 
    <cfif len(arguments.primaryGroupId)>,primary_group_id = #arguments.primaryGroupId#</cfif> 
    <cfif len(arguments.email)>,email = '#arguments.email#'</cfif> 
    <cfif len(arguments.password)>,password = '#arguments.password#'</cfif> 
    <cfif len(arguments.firstName)>,first_name = '#arguments.firstName#'</cfif> 
    <cfif len(arguments.lastName)>,last_name = '#arguments.lastName#'</cfif> 
    <cfif len(arguments.status)>,status = '#arguments.status#'</cfif> 
    <cfif len(arguments.languageId)>,language_id = #arguments.languageId#</cfif> 
    <cfif len(arguments.gmtOffset)>,gmt_offset = '#arguments.gmtOffset#'</cfif> 
where user_id = #arguments.userId# 
+3

¡Asegúrese de utilizar !!! –

+0

¿Puede agregar columnas a la tabla? Si es así, agregar un modifiedDate = sysdate en lugar de 1 = 1 te ayudaría. –

Respuesta

4

Si está actualizando y no se aprobó el argumento, simplemente configúrelo con el valor actual.

update users 
set 
    user_type = <cfif len(arguments.user_type)>#arguments.userType#<cfelse>user_type</cfif> 
    ,primary_group_id = <cfif len(arguments.primaryGroupId)>#arguments.primaryGroupId#<cfelse>primary_group_id</cfif> 
    ,email = <cfif len(arguments.email)>'#arguments.email#'<cfelse>email</cfif> 
where user_id = #arguments.userId# 
2

Bueno ... puedes contar el número de actualizaciones que realizas. Eso sería "arreglar" la consulta anterior. Como en:

<cfset updCt = false/> 
<cfif len(arguments.usertype)>, user_type = #arguments.userType# 
    <cfset updCt = true/> 
</cfif> 
<cfif len(arguments.primaryGroupID)> 
    <cfif updCt>,</cfif> 
    primary_group_id = #arguments.primaryGroupID# <cfset updCT = true/> 
</cfif> 

... usted consigue la idea. Bastante desordenado sin embargo. Creo que sería más probable que me asegure de que los argumentos están todos allí, pasando los valores inalterados para que la consulta esté actualizando todo el conjunto de datos (o lo que sea).

+0

Lástima que la tabla no tenga columnas de auditoría, es decir, 'LastUpdatedDate',' LastUpdatedBy'. Como eso resolvería el problema simplemente. – Leigh

+1

(Darien me toco enviar demasiado pronto ..) Si no, prefiero hacer referencia a la columna de la base de datos en lugar de pasar los valores originales como argumentos. En caso de que algo cambie después de que los datos fueron retirados por primera vez. Pero es la misma idea :) – Leigh

0

Si usted puede hacer todos sus argumentos (excepto el ID de usuario) opcional y sin un valor predeterminado, entonces se puede hacer algo como:

<cffunction name="updateUser"> 
<cfargument name="userID" required="true"> 

<cfset argumentMap = {field1 = {name="field_1", type="cf_sql_varchar"}, 
         field2 = {name="field_2", type="cf_sql_numeric"}, 
         ....} /> 
<!--- where field1, field2, etc will match the name 
     of the arguments to your function---> 

<cfif arrayLen(structKeyArray(arguments)) gt 1> 
    <cfquery> 
    UPDATE users 
    SET 
     <cfloop collection="#arguments#" item="arg"> 
     #argumentMap[arg].name# = <cfqueryparam 
             value="#arguments[arg]#" 
             type="#argumentMap[arg].type#" /> 
     </cfloop> 
    WHERE user_id = <Cfqueryparam value="#arguments.userID#" type="cf_sql_numeric"/> 
    </cfquery> 
</cfif> 
</cffunction> 

Esto sólo va a ejecutar la instrucción UPDATE con la argumentos dados

Cuestiones relacionadas