Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

InsertUpdate

Îåêßíçóå áðü ôï ìÝëïò Ioannis P. Τελευταία δημοσίευση από το μέλος Ioannis P στις 10-03-2006, 12:10. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  09-03-2006, 09:56 10494

    InsertUpdate

    Ξέρετε που θα βρω καμιά έτοιμη procedure για να κάνω insert αν δεν υπάρχει μια εγγραφή ή update αν υπάρχει; Το κλειδί της κάθε εγγραφής θα είναι μια στήλη.
  •  09-03-2006, 12:24 10501 σε απάντηση της 10494

    Απ: InsertUpdate

    "Γενική" έτοιμη SP είναι δύσκολο να κατασκευαστεί (θα μπορούσε να χρησιμοποιηθεί dynamic sql αλλά θα είχε διάφορους περιορισμούς). Αρα χρειάζεται να κατασκευάσεις μια "insertupdate" stored procedure για κάθε πίνακα στον οποίο θέλεις να κάνεις αυτή τη δουλειά.

    Δεν μας δίνεις ιδιαίτερα πολλές λεπτομέρειες σχετικά με τη δομή του πίνακα, οπότε θα παραθέσω μια σειρά από υποθέσεις:

    - Η στήλη-κλειδί δεν είναι autonumber (δεν θα έχει identity=yes δηλαδή), αλλά θα παίρνει τιμές από εσένα με κάποιον τρόπο
    - Η στήλη-κλειδί θα είναι ορισμένη ως primary key (πρωτεύον κλειδί)
    - Για το παράδειγμά μας, η στήλη-κλειδί είναι int.

    Εφτιαξα έναν απλό πίνακα για να κάνω τον έλεγχό μου. Παραθέτω το script παρακάτω:

    CREATE TABLE [dbo].[SFITest] (
     [id] [int] NOT NULL ,
     [name] [varchar] (100)  NULL ,
     [surname] [varchar] (100) NULL ,
     [age] [int] NULL
    ) ON [PRIMARY]
    GO

    ALTER TABLE [dbo].[SFITest] WITH NOCHECK ADD
     CONSTRAINT [PK_SFITest] PRIMARY KEY  CLUSTERED
     (
      [id]
     )  ON [PRIMARY]
    GO

    Στη συνέχεια φτιάχνω μια Stored Procedure η οποία δέχεται τις τιμές των πεδίων του πίνακα και αποφασίζει αν θα κάνει update ή insert. Η Stored Procedure είναι αρκετά self-explaining οπότε δεν γράφω σχόλια:

    CREATE PROCEDURE SFITestInsertUpdate

      @id int
    , @name varchar(100)
    , @surname varchar(100)
    , @age int

    AS

    IF EXISTS (SELECT ID FROM SFITEST WHERE ID = @id)
    BEGIN

     UPDATE SFITEST SET
       [NAME] = @name
     , SURNAME = @surname
     , AGE = @age
     WHERE ID = @id
    END
    ELSE
    BEGIN
     INSERT INTO SFITEST
     (ID, [NAME], SURNAME, AGE)
     VALUES (@id, @name, @surname,@age)

    END
    GO

    Προφανώς η SP αυτή θα πρέπει να προσαρμοστεί στο δικό σου πίνακα τόσο στις παραμέτρους όσο και στον κώδικα. Η χρήση της έχει ως εξής:

    exec sfitestinsertupdate 2, 'sotiris', 'filippidis', 32

    Αν η εγγραφή με ID=2 υπάρχει, τότε θα γίνει update. Αν δεν υπάρχει, τότε θα εισαχθεί μια νέα εγγραφή με ID=2

    Επειδή αυτή η λογική θα πρέπει να αναπαραχθεί σε ΚΑΘΕ πίνακα για τον οποίο θέλεις να κάνεις τη δουλειά, καλό θα ήταν να εξοικειωθείς με την ιδεά ορισμένων code generation tools. Templates για την αυτοματοποιημένη δρομολογία τέτοιων stored procedures μπορείς να κάνεις σχετικά εύκολα με το My Generation (http://www.mygenerationsoftware.com).

    Το θέμα φυσικά δεν εξαντλείται εδώ, άπλά προσπάθησα να κάνω μια καλή εισαγωγή. Για ο,τι άλλο χρειάζεσαι, εδώ είμαστε.

     

     

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  09-03-2006, 20:46 10529 σε απάντηση της 10501

    Απ: InsertUpdate

    Το ίδιο μπορείς να πετύχεις αν εκτελέσεις απλά το update πρωτο και το Insert δεύτερο:



    <FONT face="Lucida Console"> UPDATE SFITEST SET
       [NAME] = @name
     , SURNAME = @surname
     , AGE = @age
     WHERE ID = @id</FONT><FONT face="Lucida Console">

    INSERT INTO SFITEST (ID, [NAME], SURNAME, AGE)
     VALUES (@id, @name, @surname,@age)
    WHERE NOT EXISTS (SELECT ID FROM SFITEST WHERE ID = @id)

    </FONT>

    Το αποτέλεσμα είναι ακριβώς το ίδιο, και είναι και ANSI Standard SQL.Βέβαια, επειδή χρησιμοποιούμε SQL Server μπορούμε να ελέγξουμε το @@ROWCOUNT για να αποφύγουμε το (αμελητέο) select του insert.



    <FONT face="Lucida Console"> UPDATE SFITEST SET
       [NAME] = @name
     , SURNAME = @surname
     , AGE = @age
     WHERE ID = @id</FONT><FONT face="Lucida Console">

    IF @@ROWCOUNT = 0
    INSERT INTO SFITEST (ID, [NAME], SURNAME, AGE)
     VALUES (@id, @name, @surname,@age)
    </FONT>


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  10-03-2006, 12:10 10553 σε απάντηση της 10494

    Απ: InsertUpdate

    Σας ευχαριστώ πολύ, αυτά ακριβώς ήθελα :-))))
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems