2012-06-18 9 views
5

मेरे पास एक सारणी है जिसे मुझे अपडेट करने की आवश्यकता है जहां सभी कॉलम वैकल्पिक रूप से किसी विधि को पास किए जाते हैं।सभी फ़ील्ड वैकल्पिक होने पर क्वेरी अपडेट करें

मैं फिर कोल्डफ्यूजन का उपयोग कर यह जांचने के लिए उपयोग कर रहा हूं कि प्रत्येक कॉलम पारित किया गया था और इसे अद्यतन क्वेरी में जोड़ने के लिए।

ऐसा करने का सबसे अच्छा तरीका क्या है? मैं हमेशा user_id फ़ील्ड को अपडेट नहीं कर सकता क्योंकि यह एक पहचान फ़ील्ड है। क्या 1 = 1 की तरह कुछ ऐसा है जैसा कि नीचे है, वह काम करेगा? यह मुद्दा सिमास सिंटैक्स त्रुटियों के कारण है।

किसी भी मदद के लिए धन्यवाद।

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

!!! का उपयोग करना सुनिश्चित करें !!! –

+0

क्या आप तालिका में कोई कॉलम जोड़ सकते हैं? यदि ऐसा है तो 1 = 1 के बजाय एक संशोधितडेट = sysdate जोड़ने से आपकी मदद मिलेगी। –

उत्तर

4

यदि आप अपडेट कर रहे हैं, और तर्क पारित नहीं किया गया था तो बस इसे वर्तमान मान पर सेट करें।

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

अच्छा ... आप अपने द्वारा किए गए अपडेट की संख्या को गिन सकते हैं। वह ऊपर दिए गए प्रश्न को "ठीक" करेगा। जैसा कि:

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

... आपको विचार मिलता है। हालांकि बहुत गन्दा मुझे लगता है कि मुझे यह बीमा करने की अधिक संभावना होगी कि तर्क सभी हैं - अपरिवर्तित मूल्यों में गुजर रहे हैं, इसलिए क्वेरी पूरे डेटासेट (या जो कुछ भी) अपडेट कर रही है।

+0

बहुत खराब तालिका में ऑडिटिंग कॉलम यानी 'LastUpdatedDate',' LastUpdatedBy 'नहीं है। क्योंकि यह काफी आसानी से समस्या को हल करेगा। – Leigh

+1

(डारन मैं बहुत जल्द सबमिट करता हूं ..) यदि नहीं, तो मैं मूल मानों में तर्क के रूप में गुजरने के बजाय डेटाबेस कॉलम का संदर्भ देना पसंद करता हूं। डेटा को पहली बार खींचा जाने के बाद बस कुछ बदलाव होने पर। लेकिन यह वही विचार है :) – Leigh

0

आप अपने सभी तर्क (UserID को छोड़कर) वैकल्पिक और एक डिफ़ॉल्ट मान के बिना कर सकते हैं, तो आप की तरह कुछ कर सकते हैं:

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

यह केवल के साथ अद्यतन बयान निष्पादित करेंगे दिए गए तर्क

संबंधित मुद्दे