2012-06-18 27 views
5

Tôi có một bảng mà tôi cần phải cập nhật nơi tất cả các cột được tùy chọn chuyển cho một phương thức.Cập nhật truy vấn khi tất cả các trường là tùy chọn

Tôi sau đó sử dụng ColdFusion để kiểm tra xem mỗi cột đã được chuyển và thêm nó vào truy vấn cập nhật hay chưa.

Cách tốt nhất để làm điều này là gì? Tôi không thể luôn cập nhật trường user_id vì nó là trường nhận dạng. Có cái gì đó tương tự như thiết lập 1 = 1 như tôi có dưới đây sẽ làm việc? Vấn đề là chỉ với dấu phẩy gây ra lỗi cú pháp.

Cảm ơn bạn đã được trợ giúp.

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

Đảm bảo sử dụng !!! –

+0

Bạn có thể thêm bất kỳ cột nào vào bảng không? Nếu vậy việc thêm một biến thểDate = sysdate thay vì 1 = 1 sẽ giúp bạn. –

Trả lời

4

Nếu bạn đang cập nhật và đối số không được chuyển thì chỉ cần đặt đối số đó thành giá trị hiện tại.

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

Vâng ... bạn có thể đếm số lượng cập nhật bạn làm. Điều đó sẽ "Khắc phục" truy vấn ở trên. Như trong:

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

... bạn có ý tưởng. Mặc dù khá lộn xộn. Tôi nghĩ rằng tôi sẽ có nhiều khả năng để đảm bảo rằng các đối số là tất cả ở đó - đi qua trong giá trị không thay đổi để truy vấn được cập nhật toàn bộ dữ liệu (hoặc bất cứ điều gì).

+0

Quá xấu bảng không có cột kiểm tra tức là 'LastUpdatedDate',' LastUpdatedBy'. Như vậy sẽ giải quyết vấn đề khá đơn giản. – Leigh

+1

(Darn tôi nhấn gửi quá sớm ..) Nếu không, tôi thích tham chiếu cột cơ sở dữ liệu hơn là chuyển các giá trị ban đầu làm đối số. Chỉ trong trường hợp một cái gì đó thay đổi sau khi dữ liệu lần đầu tiên được kéo. Nhưng nó là cùng một ý tưởng :) – Leigh

0

Nếu bạn có thể làm cho tất cả lập luận của bạn (trừ UserID) không bắt buộc và không có một giá trị mặc định, sau đó bạn có thể làm một cái gì đó như:

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

này sẽ chỉ thực hiện câu lệnh UPDATE với các đối số đã cho.

Các vấn đề liên quan