"Γενική" έτοιμη 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