ceturtdiena, 2011. gada 18. augusts

Tabulas datu pārvietošana (dzēšana vienā + ievietošana citā)

Pierastākais veids, kā tabulas datus izdzēst no vienas tabulas un pārvietot uz citu, ir ar 2 komandu palīdzību- (1) no sākuma datus pārkopē no vienas uz otru tabulu (Insert Into..), (2) pirmajā tabulā pārkopētos datus izdzēš (Delete..).

Trūkumi šai pieejai:
  • Sanāk divreiz meklēt pārvietojamos datus- pirmo reizi, lai tos ievietotu tabulā (viena komanda), otru reizi, lai atrastu, ko dzēst (otra komanda).
  • Tā kā ir divas darbības, jāparūpējas, lai tas viss notiktu vienā transakcijā.
Risinājums abiem trūkumiem ir izmantot Output klauzu (ko vienreiz aprakstīju emuārā, tomēr gribēju izcelt šo pielietojumu).

Lūk arī piemērs:
Delete From dbo.tableOne
   Output Deleted.TableOneID, Deleted.FName, Deleted.LName
Into dbo.tableTwo(TableOneID, FName, LName)
Where FName in ('Vija', 'Inese')
Un pilns skripts, lai piemēru varētu darbināt:
Create Table dbo.tableOne
(
TableOneID int primary key identity,
FName nvarchar(50),
LName nvarchar(50)
)
Create Table dbo.tableTwo
(
TableTwoID int primary key identity,
TableOneID int,
FName nvarchar(50),
LName nvarchar(50)
)
Insert Into tableOne(FName, LName) Values ('Liene', 'Zariņa')
Insert Into tableOne(FName, LName) Values ('Uldis', 'Krūmiņš')
Insert Into tableOne(FName, LName) Values ('Vija', 'Liepiņa')
Insert Into tableOne(FName, LName) Values ('Jānis', 'Bērziņš')
Insert Into tableOne(FName, LName) Values ('Inese', 'Kociņa')

Delete From dbo.tableOne
Output Deleted.TableOneID, Deleted.FName, Deleted.LName
Into dbo.tableTwo(TableOneID, FName, LName)
Where FName in ('Vija', 'Inese')

Select * From dbo.tableOne
Select * From dbo.tableTwo
Protams, gadījumos, kad šāda datu pārvietošana tiek izmantota, kā vēstures ierakstu saglabāšana (respektīvi- vienmēr dzēšot datus, tie jāpārvieto uz citu tabulu), labāks veids būtu izmantot DML trigera Deleted tabulu (līdzīga ideja šajā rakstā: Piemērs: DML trigeris audita ierakstiem).

Nav komentāru:

Komentāra publicēšana