Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एसक्यूएल पिवोटेड टेबल केवल पढ़ने के लिए है और कोशिकाओं को संपादित नहीं किया जा सकता है?

मान लें कि आपके पास n_id, field . पर एक अद्वितीय बाधा है जिसका अर्थ है कि आप अधिक से अधिक एक पंक्ति से मेल खा सकते हैं (सिद्धांत रूप में कम से कम) एक INSTEAD OF का उपयोग कर सकते हैं चालू कर देना।

MERGE . के साथ यह आसान होगा (लेकिन यह SQL Server 2008 तक उपलब्ध नहीं है) क्योंकि आपको UPDATES . को कवर करने की आवश्यकता है मौजूदा डेटा का, INSERTS (जहां एक NULL मान NON NULL पर सेट है one) और DELETES जहां एक NON NULL मान NULL . पर सेट है ।

यहां आपको एक बात पर विचार करना होगा कि UPDATES . से कैसे निपटा जाए जो सभी स्तंभों को एक पंक्ति में NULL . पर सेट करता है मैंने नीचे दिए गए कोड के परीक्षण के दौरान ऐसा किया और एक या दो मिनट के लिए काफी उलझन में था जब तक मुझे एहसास नहीं हुआ कि इसने n_id के लिए आधार तालिका में सभी पंक्तियों को हटा दिया था (जिसका अर्थ है कि ऑपरेशन किसी अन्य UPDATE . के माध्यम से प्रतिवर्ती नहीं था बयान)। व्यू डेफिनिशन OUTER JOIN . होने से इस समस्या से बचा जा सकता है किसी भी टेबल पर n_id का पीके है।

चीज़ के प्रकार का एक उदाहरण नीचे है। आपको INSERT . में संभावित दौड़ स्थितियों पर भी विचार करना होगा /DELETE कोड इंगित किया गया है और क्या आपको वहां कुछ अतिरिक्त लॉकिंग संकेतों की आवश्यकता है।

CREATE TRIGGER trig
ON pivoted
INSTEAD OF UPDATE
AS
  BEGIN
      SET nocount ON;

      DECLARE @unpivoted TABLE (
        n_id             INT,
        field            VARCHAR(10),
        c_metadata_value VARCHAR(10))

      INSERT INTO @unpivoted
      SELECT *
      FROM   inserted UNPIVOT (data FOR col IN (fid, sid, NUMBER) ) AS unpvt
      WHERE  data IS NOT NULL

      UPDATE m
      SET    m.c_metadata_value = u.c_metadata_value
      FROM   metadata m
             JOIN @unpivoted u
               ON u.n_id = m.n_id
                  AND u.c_metadata_value = m.field;

      /*You need to consider race conditions below*/
      DELETE FROM metadata
      WHERE  NOT EXISTS(SELECT *
                        FROM   @unpivoted u
                        WHERE  metadata.n_id = u.n_id
                               AND u.field = metadata.field)

      INSERT INTO metadata
      SELECT u.n_id,
             u.field,
             u.c_metadata_value
      FROM   @unpivoted u
      WHERE  NOT EXISTS (SELECT *
                         FROM   metadata m
                         WHERE  m.n_id = u.n_id
                                AND u.field = m.field)
  END  


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक बच्चे के लिए सभी माता-पिता प्राप्त करें

  2. एसक्यूएल चार और सी # के बीच कनवर्ट करना

  3. एसक्यूएल क्वेरी में क्रॉस शामिल हों

  4. Ubuntu पर sqlcmd और bcp कैसे स्थापित करें?

  5. SQL कथन - अनुक्रमण के साथ गति को कैसे सुधार सकते हैं