2010-01-05 13 views
9

बदल गए हैं, मैंने एक ट्रिगर लिखा है जिस पर एक पंक्ति में कौन से कॉलम वास्तव में अपडेट किए गए हैं, इस पर आधारित एक टेबल पर कुछ अलग काम करने की आवश्यकता है। मैंने इसेटीएसक्यूएल ट्रिगर को केवल उन स्तंभों पर आग लगने की आवश्यकता है जिनके मूल्य

IF UPDATE(column-name) 

का उपयोग करके यह पूरा किया। हालांकि, यह पता चला है कि कोड के अन्य भाग हैं जो प्रत्येक मूल्य को सेट करके पंक्तियों को अपडेट करते हैं कि क्या मूल्य वास्तव में बदल गया है या नहीं और इससे ट्रिगर को "अद्यतन" वाले हिस्सों के लिए आग लगने का कारण बनता है, लेकिन जिनके मूल्य वास्तव में नहीं बदले बिलकुल।

कोड को बदलने के कारण यह संभवतः एक विकल्प नहीं है, क्या इसमें अंतर्निहित और हटाए गए तालिकाओं के बीच तुलना करने के अलावा अन्य को रोकने का एक आसान तरीका है (यदि मामले में आईएफ अद्यतन व्यर्थ हैं)?

उत्तर

14
IF EXISTS (SELECT * 
      FROM 
      INSERTED I JOIN DELETED D ON I.Key = D.Key 
      WHERE 
      I.Col <> D.Col) 
... 

या इस प्रकार कैश करने के लिए एक मेज चर का उपयोग मैं और डी

SELECT 
    CASE WHEN I.Col1 <> D.Col1 THEN 1 ELSE 0 END AS Col1Diff, 
    CASE WHEN I.Col2 <> D.Col2 THEN 1 ELSE 0 END AS Col2Diff, 
    ... 
FROM 
    INSERTED I JOIN DELETED D ON I.Key = D.Key 

का बार-बार उपयोग से बचने या विचारों गठबंधन करने के लिए सामने सभी परिवर्तनों का परीक्षण करने और ट्रिगर से बाहर निकलने के

2

मुझे नहीं पता कि। INSERTED और DELETED किसी कारण से हैं, और उनके बीच तुलना करना मेरे लिए सबसे अच्छा विकल्प प्रतीत होता है।

IF UPDATE() सिर्फ आपको बताता है कि प्रयास बनाया गया था, और यह भी नहीं दर्शाता कि यह प्रयास सफल था या नहीं।

4

कॉलम अपडेट किया गया था। पुराना मूल्य और नया मूल्य वही था जो सिर्फ एक विवरण है। मुझे लगता है कि आपका एकमात्र समाधान सम्मिलित और हटाए गए छद्म-तालिकाओं के बीच मानों की तुलना करना है।

7

जैसा कि अन्य ने कहा है, आपको INSERTED और DELETED टेबल का उपयोग करना होगा।

यहाँ मैं क्या किया है है, के बजाय:

IF UPDATE(col1) OR UPDATE(col2)) 
UPDATE table1 
SET col3 = 1 
FROM INSERTED 
WHERE table1.Id = INSERTED.Id 

मैंने किया है:

IF UPDATE(col1) OR UPDATE(col2)) 
UPDATE table1 
SET col3 = 1 
FROM 
    (SELECT Id, col1, col2 FROM INSERTED 
    EXCEPT 
    SELECT Id, col1, col2 FROM DELETED) AS ALTERED 
WHERE table1.Id = ALTERED.Id 

का उपयोग EXCEPT का चयन करता है अलग पंक्तियों जहां कॉलम मैं नष्ट कर दिया में मौजूद नहीं है दिलचस्पी (या मूल डेटा) तालिका (जिसका अर्थ है कि उन कॉलम का मान बदल गया है)। मुझे नहीं पता कि यह सबसे अच्छा जवाब है लेकिन यह काम करता प्रतीत होता है।

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

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