Stored Procedure và T-SQL
Nâng Cao Trong bài này chúng ta s tìm hiu mt s cách
import và export data trong SQL Server. Sau đó s bàn qua các
loi Stored Procedure và Cursor.
S dng bcp và BULK INSERT để import data
bcp là mt command prompt dùng để import hay export data t
mt data file (Text file hay Excel File) vào SQL Server hay ngược li. Thường khi mun chuyn
mt s lượng ln data t mt database system khác như Oracle, DB2...sang SQL Server trước
hết ta s export data ra mt text file sau đó import vào SQL Server dùng bcp command. Mt
trường hp thông dng hơn là ta export data t SQL Server sang mt Microsoft Excel file và
Excel file này có th là input cho mt program hay mt database system khác.
Chúng ta cũng có th chuyn data vào SQL Server dùng câu lnh BULK INSERT. Tuy nhiên
BULK INSERT ch có th import data vào trong SQL Server ch không th export data ra mt
data file như bcp.
Ð có th insert data vào SQL Server Database, data file phi có dng bng nghĩa là có cu trúc
hàng và ct. Chú ý khi data được bulk copy (copy hàng lot dùng bcp hay BULK INSERT) vào
mt table trong SQL Server thì table đó phi tn ti và data được cng thêm vào (append).
Ngược li khi export data ra mt data file thì mt file mi s được to ra hoc data file s b
overwrite nếu nó tn ti.
Cú pháp đầy đủ ca lnh bcp có th xem trong SQL Server Books Online. đây ch trình bày
mt s ví d đơn gin v cách s dng bcp command và BULK INSERT.
Ví d 1: Gi s bn mun export data t table Orders trong PracticeDB (đây là database được
to ra trong bài tp s 1 ) ra mt text file trong đó các ct được phân cách bng du ";". Bn có
th làm như sau: m DOS command prompt và đánh vào dòng lnh sau:
bcp PracticeDB..Orders out c:\Orders.txt -c –T –t;
Trong ví d trên ta mun bulk copy table Orders ra mt text file trong đó :
out: copy data t table hay view ra mt data file (c:\Orders.txt). Ngược li ta có th dùng switch
in để import data t text file vào SQL Server.
-c: bulk copy dùng kiu d liu Character (Char) (nếu không ch rõ thì SQL Server s dùng
"TAB" character (\t) để phân định các ct và dùng new line character (\n) để phân định các hàng
như các giá tr default).
-t;: du ";" đi sau switch "t" cho biết ta mun dùng ";" để phân định các ct (nếu không s dùng
giá tr mc định như trên)
-T: dùng (NT) Trust connection để kết ni vi database. Nghĩa là nếu user đã authenticated (cho
phép) vào được Windows system thì đương nhiên được s dng SQL Server mà không cn dùng
thêm username và password nào khác.
Ví d 2: Thay vì copy toàn b table ta có th dùng query để select mt phn data và export ra
text file như sau:
bcp "Select * From practiceDB..Orders" queryout c:\Orders.txt -c -SVinhtai -Usa -Pabc
Trong ví d này ta select toàn b data trong Orders table ra mt text file dùng query và SQL
Server authentication.
queryout : cho biết đây là mt query ch không phi là table.
-S : tên ca SQL Server (hay tên ca mt Instance)
-U : SQL user name dùng để log on
-P : password dùng để log on.
Ví d 3 : dùng BULK INSERT để bulk copy data t text file vào SQL Server database. M
Query Analyser (BULK INSERT là mt T-SQL command ch không phi là mt command
prompt utility) và đánh vào các dòng sau :
BULK INSERT PracticeDB..Orders FROM 'c:\Orders.txt ' WITH (DATAFILETYPE = 'CHAR')
Trong ví d trên DATAFILETYPE= 'CHAR' cho biết data được cha dng Char data type.
Nêú mun dùng data type dng unicode thì dùng 'WIDECHAR'
Chú ý: Các switch trong bcp command là case-sensitive. Nghĩa là ch hoa và ch thường s có ý
nghĩa khác nhau.
Distributed Queries
Ðôi khi chúng ta mun select data t nhng database system khác như MS Access, Oracle,
DB2... hay thm chí t mt SQL Server khác ta cn phi dùng distributed query. SQL Server s
dùng k thut OLEDB và các API để chuyn các query này ti các database system khác. Có 2
cách để truy cp vào các database system khác là dùng LINKED SERVERAd Hoc
Computer Name.
Linked Server:
Linked Server là mt server o được dùng để truy cp vào các database system khác. Mt khi đã
setup thì ta có th query data dùng four-part name :
linked_server_name.catalog.schema.object_name . Trong đó catalog thường tương đương vi
database name, Schema tương đương vi database owner và object_name tương đương vi table
hay view.
Ví d: Gi s ta setup mt Linked Server vào Access database "PracticeDB.mdb" trong đó các
table đều tương t như PracticeDB database trong SQL Server (được to ra trong phn bài tp s
1).
M Enterprise Manager -> Chn node Security ca local server -> Right-Click lên node Linked
Server chn New Linked Server. Sau đó nhp vào tên ca Linked Server LinkedPracticeDB,
trong phn Provider Name chn Microsoft Jet 4.0 OLEDB Provider. Trong phn Data Source
nhp vào v trí ca Access database (C:\PracticeDB.mdb) và click OK.
Ta s có Linked Server tên LinkedPracticeDB xut hin dưới phn Security/Linked Server. Gi
s ta mun select data t Linked Server này ta có th dùng Query Analyser như sau:
Select * from LinkedPracticeDB...Customers
Trong ví d trên ta dùng tên ca Linked Server và theo sau là ba chm (để truy cp vào
database ta phi dùng four-part name nhưng trong trường hp này ta dùng default value nên
không cn cho biết tên ca Catalog và Schema nhưng phi dùng du chm để phân bit tng
phn).
Ngoài cách trên ta có th dùng pass-through query vi OPENQUERY function như sau:
Select * from OPENQUERY(LinkedPracticeDB,'Select * from Customers')
Trong ví d trên ta thy function OPENQUERY s tr v mt data set và có th nm sau
keyword FROM như mt table. Khi dùng OPENQUERY function ta cn cho biết tên ca Linked
Server và query mà ta mun thc hin.
Lưu ý: function trong SQL Server được dùng tương t như là stored procedure.
Ad Hoc Computer Name
Ngoài cách dùng Linked Server như đã trình bày trên ta có th dùng ad hoc computer name (ad
hoc nghĩa là lâm thi, tm thi). Nghĩa là đối vi nhng database system mà ta thường xuyên
query thì dùng Linked Server còn đối vi nhng query lâu lâu mi dùng đến thì ta có th select
data bng OPENROWSET hay OPENDATASOURCE functions
Ví d: ta cũng s select data t Access database như trên dùng OPENROWSET
Select * from OPENROWSET('Microsoft.jet.oledb.4.0','C:\PracticeDB.mdb'; 'admin'; '',
Customers)
Trong ví d trên khi dùng OPENROWSET ta cn phi đưa vào tt c nhng thông tin cn thiết
để connect vào database như tên ca Provider, v trí ca file, username, password (trường hp
này không có password) và tên ca table mà ta mun select. Mi ln ta thc thi câu lnh trên
SQL Server đều kim tra security trong khi đó nếu dùng Linked Server thì ch kim ta mt ln
mà thôi. OPENROWSET tương t như OPENQUERY ch nó tr v mt rowset và có th đặt
vào v trí ca mt table trong câu lnh query.
Ngoài cách dùng trên ta cũng có th dùng OPENDATASOURCE để query như sau:
Select * from OPENDATASOURCE('Microsoft.jet.oledb.4.0',
'Data Source = C:\PracticeDB.mdb; User ID = Admin; Password = ')
...Customers
Trong ví d trên ta thy OPENDATASOURCE tr v mt phn ca four-part name (nghĩa là
tương đương vi tên ca Linked Server) cho nên ta phi dùng thêm ba du chm.
Cursors
Nếu gii thích mt cách ngn gn thì cursor tương t như recordset hay dataset trong
programming. Nghĩa là ta select mt s data vào memory sau đó có th ln lượt làm vic vi
tng record bng cách Move Next...
Có 3 loi cursors là Transact- SQL Cursors, API Cursors và Client Cursors. Trong đó Transact-
SQL và API thuc loi Server Cursors nghĩa là cursors được load lên và làm vic bên phía
server. Trong khuôn kh bài hc này ta ch nghiên cu Transact-SQL cursors.
Transact-SQL cursors được to ra trên server bng các câu lnh Transact-SQL và ch yếu được
dùng trong stored procedures và triggers. Trước hết hãy xem qua mt ví d v cursor:
DECLARE @au_lname varchar(40), @au_fname varchar(20)
DECLARE Employee_Cursor CURSOR FOR
SELECT LastName, FirstName FROM Northwind.dbo.Employees
OPEN Employee_Cursor
FETCH NEXT FROM Employee_Cursor INTO @au_lname, @au_fname
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Author:' + @au_fname + ' ' + @au_lname
FETCH NEXT FROM Employee_Cursor INTO @au_lname, @au_fname
END
CLOSE Employee_Cursor
DEALLOCATE Employee_Cursor
Trong ví d trên ta s select LastName và FirstName t Employees table ca Northwind
database và load vào Employee_Cursor sau đó ln lượt in tên ca các employee ra màn hình. Ð
làm vic vi mt cursor ta cn theo các bước sau:
* Dùng câu lnh DECLARE CURSOR để khai báo mt cursor. Khi khai báo ta cũng phi cho
biết câu lnh SELECTs được thc hin để ly data.
* Dùng câu lnh OPEN để đưa data lên memory (populate data). Ðây chính là lúc thc hin câu
lnh SELECT vn được khai báo trên.
* Dùng câu lnh FETCH để ly tng hàng data t record set. C th là ta phi gi câu lnh
FETCH nhiu ln. FETCH tương t như lnh Move trong ADO recordset ch nó có th di
chuyn ti lui bng câu lnh FETCH FIRST, FETCH NEXT, FETCH PRIOR, FETCH
LAST, FETCH ABSOLUTE n, FETCH RELATIVE n nhưng khác ch là nó ly data b
vào trong variable (FETCH...FROM...INTO variable_name). Thông thường ta FETCH data
trước sau đó loop cho ti record cui ca Cursor bng vòng lp WHILE bng cách kim tra
global variable @@FETCH_STATUS (=0 nghĩa là thành công).
* Khi ta viếng thăm tng record ta có th UPDATE hay DELETE tùy theo nhu cu (trong thí d
này ch dùng lnh PRINT)
* Dùng câu lnh CLOSE để đóng cursor. Mt s tài nguyên (memory resource) s được gii
phóng nhưng cursor vn còn được khai báo và có th OPEN tr li.
* Dùng câu lnh DEALLOCATE để phóng thích hoàn toàn các tài nguyên dành cho cursor (k
c tên ca cursor).
Lưu ý là trong ví d trên trước khi dùng Cursor ta cũng declare mt s variable (@au_fname
và @au_lname) để cha các giá tr ly được t cursor. Bn có th dùng Query Analyzer để chy
th ví d trên.
Stored Procedures
Trong nhng bài hc trước đây khi dùng Query Analyzer chúng ta có th đặt tên và save các
nhóm câu lnh SQL vào mt file dưới dng script để có th s dng tr li sau này. Tuy nhiên
thay vì save vào text file ta có th save vào trong SQL Server dưới dng Stored Procedure.
Stored Procedure là mt nhóm câu lnh Transact-SQL đã được compiled (biên dch) và cha
trong SQL Server dưới mt tên nào đó và được x lý như mt đơn v (ch không phi nhiu câu
SQL riêng l).
Ưu Ðim Ca Stored Procedure
Stored Procedure có mt s ưu đim chính như sau:
o Performance : Khi thc thi mt câu lnh SQL thì SQL Server phi kim tra permission xem
user gi câu lnh đó có được phép thc hin câu lnh hay không đồng thi kim tra cú pháp ri
mi to ra mt execute plan và thc thi. Nếu có nhiu câu lnh như vy gi qua network có th
làm gim đi tc độ làm vic ca server. SQL Server s làm vic hiu qu hơn nếu dùng stored
procedure vì người gi ch gi mt câu lnh đơn và SQL Server ch kim tra mt ln sau đó to
ra mt execute plan và thc thi. Nếu stored procedure được gi nhiu ln thì execute plan có th
được s dng li nên s làm vic nhanh hơn. Ngoài ra cú pháp ca các câu lnh SQL đã được