Tài liệu Cải tiến trong lệnh T-SQL của SQL Server 2008 (P.2) - Pdf 86

Cải tiến trong lệnh T-SQL của SQL Server 2008 (P.2)

Trong phần trước chúng ta đã tìm hiểu một số cải tiến trong câu
lệnh T-SQL của SQL Server 2008, gồm IntelliSense, Grouping
Set, bảng gợi ý FORCESEEK, … Trong phần này chúng ta sẽ
tiếp tục tìm hiểu những kiểu dữ liệu mới được giới thiêu trong
SQL Server 2008.

SQL Server 2008 đã giới thiệu một số kiểu dữ liệu mới giúp mở rộng đối tượng làm việc và cải
tiến khả năng thực thi của SQL Server. Ví dụ, kiểu User-Defined Table (bảng do người dùng
định nghĩa) và Table-Valued Parameter cho phép người dùng đưa một nhóm kết quả vào một thủ
tục và lưu nhiều giá trị trả về lên máy chủ, trong khi kiểu dữ liệu Date và Time có thể giúp tiết
kiệm tài nguyên bộ nhớ vì chiếm dụng ít bộ nhớ hơn trong trường hợp người dùng chỉ cần lưu
ngày hay giờ, và giúp thao tác dễ dàng hơn khi làm việc với chúng. Trong phần này chúng ta sẽ
tập trung tìm hiểu hai kiểu dữ liệu này, về phạm vi sử dụng và khả năng ứng dụng.

User-Defined Table Type (UDTT) và Table-Value Parameter (TVP)

Với SQL Server 2008 chúng ta có thể tạo một UDTT (kiểu bảng do người dùng định nghĩa) theo
định nghĩa cấu trúc bảng. Để đảm bảo rằng mọi dữ liệu trong UDTT đáp ứng được mọi tiêu chí,
chúng ta có thể tạo những rằng buộc riêng và những khóa chính trên kiểu bảng này. Ngoài ra,
chúng ta có thể sử dụng một UDTT để khai báo nhiều TVP (tham số do bảng định giá trị) cho
các công cụ hay thủ tục lưu trữ để gửi nhiều bản ghi dữ liệu tới một thủ tục lưu trữ hay một công
cụ mà không phải tạo một bảng tạm thời hay nhiều tham số.

TVP giờ đây linh hoạt hơn rất nhiều, và trong một số trường hợp nó còn có khả năng thực thi tốt
hơn những b
ảng tạm thời hay cung cấp nhiều phương pháp khác nhau để không phải sử dụng đến

định dạng của UDTP, …

2. SQL Server không duy trì thống kê các cột của TVP.

3. TVP phải được chuyển như những tham số READONLY nhập vào sang những lệnh T-SQL.
Chúng ta không thể thực hiện các tác vụ DML như UPDATE (cập nhật), DELETE (xóa), hay
INSERT (chèn) trên một TVP trong phần chính của lệnh. Nếu cần phải thay đổi dữ liệu được
chuyển tới một thủ tục lưu trữ hay lệnh biểu hiện tham số trong TVP thì chúng ta phải chèn dữ
liệu đó vào một bảng tạm thời bay một biến của bảng. Ngoài ra, chúng ta không thể sử dụng các
biến của bảng như các tham số OUTPUT (kết xuất), mà chỉ có thể sử dụng như các tham số
INPUT (nhập vào).

Ví dụ

Trong ví dụ này chúng ta sẽ tìm hiểu phương pháp tạo một kiểu bảng do người dùng định nghĩa,
tạo một biến của kiểu bảng này, chèn các bản ghi vào bảng và chuyển nó tới thủ tục lưu trữ như
một tham số TVP.

Trước tiên chúng ta sẽ tạo một bảng và chèn các bản gi vào đó. Cấu trúc lệnh tạo bảng này như
sau:
--Tạo bảng lưu trữ thông tin khách hàng
CREATE TABLE [Customers]
(
[ID] [int] NOT NULL PRIMARYKEY IDENTITY,
[FirstName] [varchar](100)NOT NULL,
[LastName] [varchar](100)NOT NULL,
[Email] [varchar](200) NOTNULL
)
GO
--Chèn bản ghi vào bảng Customer
Sau đó tạo một thủ tục lưu trữ để chuyển tác biến của UDTT như một TVP. Cần nhớ quy tắc
phạm vi cho một biến được áp dụng trong trường hợp này cũng như với biến của UDTT vì biến
này sẽ tự động vượt quá phạm vi khi bảng được tạo. Chuyển tác TVP bằng ứng dụng .NET
Trước tiên chúng ta cần cài đặt phần mề
m .NET Framework 3.5, phần mềm này cung cấp một
kiểu cơ sở dữ liệu SQL mới được gọi là Structure bên trong vùng tên System.Data.SQLClient.

Đảm bảo rằng DataTable mà chúng ta tạo trong ứng dụng .NET phù hợp với lược đồ của UDTT,
nói cách khác thì tên của cột, số lượng cột và các kiểu dữ liệu phải giống nhau. Mặc dù trong
một số trường hợp nhất định, nếu kiểu dữ liệu không giống nhau như
ng nếu nó vẫn tương thích
với nhau thì vẫn được phép vận hành.
//Tạo một bảng dữ liệu cục bộ lưu trữ các bản ghi của khách hàng
DataTable dtCustomers = new DataTable("Customers");
DataColumn dcFirstName = new DataColumn("FirstName", typeof(string));
DataColumn dcLastName = new DataColumn("LastName", typeof(string));
DataColumn dcEmail = new DataColumn("Email", typeof(string));
dtCustomers.Columns.Add(dcFirstName);
dtCustomers.Columns.Add(dcLastName);
dtCustomers.Columns.Add(dcEmail);
//Chèn customer 1
DataRow drCustomer = dtCustomers.NewRow();
drCustomer["FirstName"] = "AAA";
drCustomer["LastName"] = "XYZ";
drCustomer["Email"] = "";

Không ai có thể phủ nhận tầm quan trọng của một kiểu dữ liệu chỉ có thể lưu trữ ngày tháng mà
không có thời gian hoặc thời gian mà không có ngày tháng. Ví dụ, để lưu trữ ngày sinh của một
nhân viên chúng ta sẽ chỉ cần lưu trữ ngày, còn thời gian là không cần thiết. Tương tự, để lưu trữ
những thông tin theo t
ừng giai đoạn trong ngày như từ 00:01 tới 08:00 (giai đoạn A), từ 08:01
đến 16:00 (giai đoạn B), và từ 16:01 đến 24:00 (giai đoạn C) thì chúng ta chỉ cần lưu trữ thời
gian còn ngày không liên quan trong trường hợp này. Cho tới phiên bản SQL Server 2005 chúng
ta không có lựa chọn lưu trữ riêng biệt, thay vào đó phải lựa chọn sử dụng kiểu dữ liệu hoặc
DATETIME hoặc SMALLDATETIME. Việc lưu cả ngày và giờ không chỉ gây rắc rối khi làm
việc mà còn làm lãng phí vùng lưu trữ. Ví dụ, để lưu trữ ngày sinh của 100 triệu khách hàng
chúng ta sẽ phải sử dụng khoảng 770MB nếu sử dụng kiểu dữ liệu DATETIME. Tuy nhiên trong


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status