SlideShare a Scribd company logo
“Chuyên trang dành cho   kỹ thuật viên tin học”
                                                             CHIA SẺ - KINH NGHIỆM - HỌC TẬP - THỦ THUẬT


Cải tiến trong lệnh T-SQL của SQL Server 2008 (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 các tham
số. Sử dụng TVP có các lợi ích sau, không sử dụng khóa cho mẫu dữ liệu ban đầu từ máy trạm, không
cần phải biên tập lại lệnh, giảm truy cập tới máy chủ, cho phép máy trạm chỉ định thứ tự sắp xếp và
những khóa chính, …

Khi các biến của bảng được được chuyển tác như những tham số thì bảng này sẽ được hiên thực hóa
trong cơ sở dữ liệu hệ thống tempdb hơn là chuyển tác toàn bộ nhóm dữ liệu trong bộ nhớ, điều này
giúp việc xử lý với lượng dữ liệu lớn hiệu quả hơn. Mọi máy chủ thực hiện chuyển tác các tham số biến
thiên của bảng được chuyển tác bởi tham chiếu, sử dụng tham chiếu này như một con trỏ tới bảng đó
trong tempdb để tránh tạo bản sao cho dữ liệu đầu vào.

Ứng dụng

Các lập trình viên luôn gặp phải rắc rối khi chuyển nhiều bản ghi trong cơ sở dữ liệu để tận dụng tối đa
khả năng thực thi. Ví dụ, khi một lập trình viên cần lập trình cho trang chấp nhận thứ tự gồm nhiều
mục thì họ sẽ phải viết theo logic riêng để nhóm mọi lệnh chèn thàng một chuỗi định giới hay kiêu XML
(OPENXML trong SQL Server 2000) rồi chuyển những giá trị văn bản đó sang một thủ tục hay lệnh.
Thao tác này yêu cầu thủ tục hay lệnh đó phải có logic cần thiết cho việc tháo nhóm những giá trị và
làm cho những cấu trúc dữ liệu có hiệu lực, sau đó tiến hành chèn các bản ghi. Quá nhiều thao tác cần
thực hiện nhưng lại không tối ưu, trong trường hợp này chúng ta có thể sử dụng TVP để chuyển một
bảng dữ liệu gồm nhiều bản ghi từ ứng dụng .NET sang SQL Server và chèn trực tiếp vào bảng mà
không phải thực hiện thêm bất kì thao tác nào tại máy chủ này.




                                                  1 of 9
Hạn chế

1. UDTT tồn tại một số hạn chế, ví dụ nó không thể sử dụng như một cột trong bản, định dạng bảng
không thể thay đổi sau khi đã được tạo, một giá trị mặc định không thể được chỉ định trong đị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
        INSERT INTO [Customers] (FirstName, LastName, Email)
        VALUES('AAA','XYZ', 'aaa@test.com')
        INSERT INTO [Customers] (FirstName, LastName, Email)
        VALUES('BBB','XYZ', 'bbb@test.com')
        INSERT INTO [Customers] (FirstName, LastName, Email)
        VALUES('CCC','XYZ', 'bbb@test.com')
        GO




Tiếp theo chúng ta sẽ tạo một UDTT khi đã tạo thành công chúng ta có thể xem chi tiết bảng sử dụng
hai System Catalog View:




                                                 2 of 9
--Tạo một UDTT lưu trữ các bản ghi khách hàng
      CREATE TYPE [CustomersUDT] AS TABLE
      (
      [FirstName] [varchar](100)NOT NULL,
      [LastName] [varchar](100)NOT NULL,
      [Email] [varchar](200) NOTNULL
      )
      GO
      --Chúng ta có thể sử dụng các Catalog View để xem bảng được tạo
      SELECT name, system_type_id, user_type_id, is_assembly_type, is_table_type
      FROM SYS.TYPES WHERE is_table_type = 1
      SELECT name, system_type_id, user_type_id, is_assembly_type, is_table_type
      FROM SYS.TABLE_TYPES
      GO




Chúng ta cũng có thể sử dụng SQL Server Management Studio (SSMS) để xem các bảng người dùng
định nghĩa đã được tạo trong một cơ sở dữ liệu, truy cập vào node User-Defined Table Types trong
node Types cửa bảng Object Explorer.




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.




                                               3 of 9
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"] = "aaa@test.com";
      dtCustomers.Rows.Add(drCustomer);
      //Chèn customer 2
      drCustomer = dtCustomers.NewRow();
      drCustomer["FirstName"] = "BBB";
      drCustomer["LastName"] = "XYZ";
      drCustomer["Email"] = "bbb@test.com";
      dtCustomers.Rows.Add(drCustomer);
      //Chèn customer 3
      drCustomer = dtCustomers.NewRow();
      drCustomer["FirstName"] = "CCC";
      drCustomer["LastName"] = "XYZ";
      drCustomer["Email"] = "ccc@test.com";
      dtCustomers.Rows.Add(drCustomer);
      //Tạo đối tượng Connection để kết nối tới máy chủ/cơ sở dữ liệu
      SqlConnection conn = new SqlConnection("Data Source=ARALI-LAPTOP;Initial
      Catalog=tempdb;Integrated Security=true");
      conn.Open();
      //Tạo một đối tượng Command gọi thủ tục lưu trữ
      SqlCommand cmdCustomer = new SqlCommand("AddCustomers", conn);
      cmdCustomer.CommandType = CommandType.StoredProcedure;




                                                4 of 9
//Tạo một tham số sử dụng SQL DB type viz. Structured mới để chuyển đổi như
       tham số giá trị bảng
       SqlParameter paramCustomer =
       cmdCustomer.Parameters.Add("@CustomersTVP", SqlDbType.Structured);
       paramCustomer.Value = dtCustomers;
       //Chạy truy vấn
       cmdCustomer.ExecuteNonQuery();

Kiểu dữ liệu Date và Time mới

Trường hợp ứng dụng thực

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 SQL Server 2008 vấn đề này đã được khắc phục, giờ đây chúng ta có thể
lưu trữ cùng loại thông tin với dung lượng chiếm dụng ít hơn nhiều (khoảng 290MB trong ví dụ trên, chỉ
lưu trữ ngày) bằng cách chỉ lưu trữ ngày hoặc giờ. Không chỉ có vậy, những kiểu dữ liệu mới này sẽ có
một vùng rộng hơn, thời gian được chia nhỏ tới đơn vị nano giây (một phần tỷ giây), và cho phép lưu
trữ khoảng trống múi giờ với dữ liệu đó.

SQL Server 2008 giới thiệu 4 kiểu dữ liệu DATETIME mới bao gồm:

DATE

Trong các phiên bản SQL Server trước, chúng ta phải sử dụng kiểu dữ liệu DATETIME hay
SMALLDATETIME cho dù chúng ta chỉ cần lưu trữ Date. Những kiểu dữ liệu này lưu trữ thời gian như
một thành phần của nó. Sau đó chúng ta cần phải định dạng dữ liệu kết xuất để chỉ hiện thị thành phần
ngày. SQL Server 2008 giới thiệu kiểu dữ liệu DATE rất hữu dụng trong việc lưu trữ ngày. Nó hỗ trợ lịch
Gregorian và sử dụng 3 byte để lưu trữ ngày. Vùng của kiểu dữ liệu DATE từ 01-01-0001 tới
12-31-9999, trong khi kiểu dữ liệu DATETIME có vùng từ 01-01-1753 tới 31-12-9999 và
SMALLDATETIME từ 01-01-1900 tới 06-06-2079.

       CREATE TABLE Employee
       (
       EmpId INT IDENTITY,
       Name VARCHAR(100),
       DOB DATE, -- Date of birth column will store only date and no time part
       DOJ DATE DEFAULT GETDATE()--Date of joining will be default, again only date,
       no time part
       )
       GO
       --Tạo một biến DATE rồi gán một giá trị ngày
       DECLARE @DOB DATE = CONVERT(DATE,'12/05/1982')



                                                 5 of 9
INSERT INTO Employee(Name, DOB)
       VALUES ('Rocky', @DOB)
       GO
       SELECT * FROM Employee
       GO




TIME

Giống với kiểu dữ liệu Date, trong SQL Server 2008 giới thiệu một kiểu dữ liệu TIME được sử dụng trong
trường hợp chỉ cần lưu trữ thời gian. Vùng dữ liệu TIME trong khoảng 00:00:00.0000000 tới
23:59:59.9999999. Độ chính xác của kiểu dữ liệu TIME lên đến 100 nano giây, tuy nhiên chúng ta có
thể giảm giá trị này để tiết kiệm bộ nhớ (khoảng 3 đến 5 byte). Kiểu dữ liệu này không nhận biết được
múi giờ, và nó sử dụng hệ 24 giờ.

       CREATE TABLE ShiftMaster
       (
       ShiftName VARCHAR(100),
       StartTime TIME, -- StartTime without storing date component
       EndTime TIME -- EndTime without storing date component
       )
       GO
       --Khai báo biến TIME để lưu trữ thời gian
       DECLARE @StartTime TIME = '00:01'
       DECLARE @EndTime TIME = '08:00'
       INSERT INTO ShiftMaster(ShiftName, StartTime, EndTime)
       VALUES
       ('Shift A', @StartTime, @EndTime),
       ('Shift B','08:01', '04:00'),
       ('Shift C','04:01', '00:00')
       GO
       SELECT * FROM ShiftMaster
       GO




DATETIMEOFFSET

Đây là một kiểu dữ liệu mới khác của SQL Server 2008. Nhờ kiểu dữ liệu này chúng ta có thể lưu trữ
ngày/giờ với độ chính xác rất cao. Dù chúng ta không thể lưu trữ múi giờ như Eastern Time, Central
Time, … nhưng chúng ta có thể lưu trữ offset -5:00 cho Eastern Standard Time và -6:00 cho Central
Standard Time, … Vùng dữ liệu Date trong khoảng từ 01-01-0001 tới 12-31-9999, vùng Time trong
khoảng 00:00:00 tới 23:59:59.9999999. Vùng Offset trong khoảng từ -14:00 đến +14:00. Độ chính



                                                6 of 9
xác của dữ liệu có thể được cài đặt thủ công theo lịch Gregorian. DATETIMEOFFSET định nghĩa một ngày
mà được kết hợp với một khoảng thời gian của một ngày khác nhận biết được múi giờ và dựa trên hệ giờ
24 giờ.



      CREATE TABLE OrderMaster
      (
      OrderID INT IDENTITY,
      CustomerID INT,
      OrderDateTIme DATETIMEOFFSET--DATETIMEOFFSET data type to store date and
      time along with the time-zone offset
      )
      GO
      --Khai báo biến DATETIMEOFFSET để lưu trữ ngày và giờ cùng với Offset múi giờ
      DECLARE @OrderDateTIme DATETIMEOFFSET= '2009-01-16 00:24 +05:30'
      INSERT INTO OrderMaster(CustomerID, OrderDateTIme)
      VALUES
      (1, @OrderDateTIme),
      (1,'2009-01-18 00:24 +05:30'),
      (2,'2009-01-18 00:24 -04:00')
      GO
      SELECT * FROM OrderMaster
      GO




DATETIME2

Lí do SQL Server 2008 giới thiệu kiểu dữ liệu DATETIME2 là do kiểu dữ liệu DATETIME không phù hợp
với chuẩn SQL, và DATETIME không hoàn toàn tương thích với kiểu dữ liệu .NET DATETIME. Về cơ bản
DATETIME2 là sự kết hợp của kiểu dữ liệu DATE và TIME mới và sử dụng 6 đến 8 byte. Kích thước thực
được xác định bởi mức độ chính xác của dữ liệu được lưu trữ, ví dụ, DATETIME(0) sẽ sử dụng 6 byte,
DATETIME(3) sẽ sử dụng 7 byte trong khi đó DATETIME(7) mặc định sử dụng 8 byte (con số bên trong
dấu ngoặc cho biết độ chính xác của thông tin, và bạn có thể thay đổi giá trị này trong khoảng 0 đến 7).

DATETIME2 chấp nhận nhiều định dạng chuỗi. Kiểu dữ liệu này cũng sử dụng lịch Gregorian, và chúng
ta không thể chỉ định múi giờ trong kiểu dữ liệu này.

Ngoài những thay đổi trong kiểu dữ liệu, SQL Server 2008 còn giới thiệu 5 hàm mới, gồm
SYSDATETIME, SYSDATETIMEOFFSET, SYSUTCDATETIME, SWITCHOFFSET và TODATETIMEOFFSET.

Hàm SYSDATETIME trả về thời gian hiện tại của hệ thống mà không có múi giờ với độ chính xác 10
mili giây.

Hàm SYSDATETIMEOFFSET giống với hàm SYSDATETIME, tuy nhiên hàm này bao gồm cả múi giờ.

Hàm SYSUTCDATETIME trả về ngày và giờ Universal Coordinated Time (giống với Greenwich Mean



                                                 7 of 9
Time) với độ chính xác 10 mili giây. Thời gian này được lấy từ thời gian cục bộ hiện thời và cài đặt múi
giờ của máy chủ nơi SQL Server đang vận hành.

Hai hàm SYSDATETIME và SYSUTCDATETIME đều trả về kiểu dữ liệu DATETIME2, trong khi đó hàm
SYSDATETIMEOFFSET trả về kiểu dữ liệu DATETIMEOFFSET.

Hàm SWITCHOFFSET trả về một giá trị DATETIMEOFFSET được thay đổi từ múi giờ lưu trữ Offset tới
một múi giờ Offset mới cụ thể. Hàm TODATETIMEOFFSET chuyển đổi một ngày cục bộ hay giá thời
gian và một múi giờ Offset cuh thể tới một giá trị DATETIMEOFFET.



      SELECT
      GETDATE()AS [GETDATE],

      --Trả về hời gian hiện tại của hệ thống mà không có múi giờ với độ chính xác là 10 mili
      giây.
      SYSDATETIME() AS [SYSDATETIME],

      --Trả về ngày và giờ Universal Coordinated Time với độ chính xác 10 mili giây.
      SYSUTCDATETIME() AS [SYSUTCDATETIME]




      SELECT

      --Trả về thời gian hiện tại của hệ thống kèm múi giờ với độ chính xác 10 mili giây
      SYSDATETIMEOFFSET() AS [SYSDATETIMEOFFSET],

      --Trả về giá trị DATETIMEOFFSET được thay đổi từ múi giờ được lưu trữ Offset tới một múi
      giờ được lưu trữ Offset mới được chỉ định và giữ nguyên giá trị ban đầu
      SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:00')AS [SWITCHOFFSET],

      --Chuyển đổi giá trị ngày hay giờ cục bộ và một múi giờ Offset được chỉ định tới một giá trị
      DATETIMEOFFSET
      TODATETIMEOFFSET(GETDATE(),'+05:30') AS [TODATETIMEOFFSET]




Kết luận

UDTT và TVP cho phép người dùng chuyển một nhóm kết quả tới một thủ tục và lưu nhiều giá trị trả về
tới máy chủ cần sử dụng trong các phiên bản trước đó của SQL Server.

Những kiểu dữ liệu Date và Time mới trong SQL Server 2008 giúp tiết kiệm bộ nhớ vì chiếm dụng ít hơn
trong trường hợp chỉ lưu ngày hoặc giờ (chính xác hơn), giúp quá trình làm việc với các dữ liệu này dễ
dàng hơn, và cho phép làm việc với DATETIMEOFFSET.




                                                  8 of 9
Trong phần tới chúng ta sẽ tìm hiểu kiểu dữ liệu mới HIERARCHYID cho phép lưu cấu trúc phân cấp
trong cơ sở dữ liệu.

Xian (Theo SQLServerCentral)




                               Công ty TNHH đầu tư phát triển tin học GC Com
                           Chuyên trang kỹ thuật máy vi tính cho kỹ thuật viên tin học
                                  Điện thoại: (073) - 3.511.373 - 6.274.294
                                    Website:   http://www.gccom.net




                                                     9 of 9

More Related Content

PPT
Bài 11 tạo bảng và sử dụng các kiểu dữ liệu
PDF
Bài 3: Làm việc với kiểu dữ liệu và mã kịch bản - Giáo trình FPT
PDF
Dữ liệu không gian trên SQL Server - (Spatial Data in SQL Server)
PDF
Bài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPT
PDF
Bài 5: Hàm người dùng định nghĩa & VIEW - Giáo trình FPT
PDF
Bài 1: Làm quen với SQL Server 2008 - Giáo trình FPT
PDF
Bài 6: Bảo mật trong SQL SERVER 2008 - Giáo trình FPT
PPT
Slide Hệ Quản Trị Cơ sở dữ liệu - CHƯƠNG 2
Bài 11 tạo bảng và sử dụng các kiểu dữ liệu
Bài 3: Làm việc với kiểu dữ liệu và mã kịch bản - Giáo trình FPT
Dữ liệu không gian trên SQL Server - (Spatial Data in SQL Server)
Bài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPT
Bài 5: Hàm người dùng định nghĩa & VIEW - Giáo trình FPT
Bài 1: Làm quen với SQL Server 2008 - Giáo trình FPT
Bài 6: Bảo mật trong SQL SERVER 2008 - Giáo trình FPT
Slide Hệ Quản Trị Cơ sở dữ liệu - CHƯƠNG 2

What's hot (20)

PDF
ôn tập dbms
PDF
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
PPTX
2 co ban ve sql
PDF
Slides1
PDF
Sao lưu & phục hồi database SQL Server | zBackup.vn
PDF
Bài 3: Ngôn ngữ truy vân có cấu trúc (SQL) - Giáo trình FPT
PDF
Lap trinhcosodulieuvoi c-sharp_phan-3
DOC
Qtu.vn sql - chuong 7
DOCX
Mô hình 3 lớp trong C#
PPT
Slide Hệ Quản Trị Cơ sở dữ liệu - CHƯƠNG 5
PDF
Bài 2: Các khái niệm trong CSDL quan hệ - Giáo trình FPT
PDF
Bài 1: Tổng quan về cơ sở dữ liệu - Giáo trình FPT
PDF
00 overview of_sql_server
PDF
Bài 5: Chuẩn hóa cơ sở dữ liệu
PPTX
Cursor & Function trong SQL Server
PDF
Mo hinh-3-lop
PDF
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
PDF
Com201 slide 1
PDF
BÀI 6: Thủ tục (SUB) và hàm (FUNCTION) - Giáo trình FPT
PDF
Cơ sở dữ liệu PTIT slide 2
ôn tập dbms
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
2 co ban ve sql
Slides1
Sao lưu & phục hồi database SQL Server | zBackup.vn
Bài 3: Ngôn ngữ truy vân có cấu trúc (SQL) - Giáo trình FPT
Lap trinhcosodulieuvoi c-sharp_phan-3
Qtu.vn sql - chuong 7
Mô hình 3 lớp trong C#
Slide Hệ Quản Trị Cơ sở dữ liệu - CHƯƠNG 5
Bài 2: Các khái niệm trong CSDL quan hệ - Giáo trình FPT
Bài 1: Tổng quan về cơ sở dữ liệu - Giáo trình FPT
00 overview of_sql_server
Bài 5: Chuẩn hóa cơ sở dữ liệu
Cursor & Function trong SQL Server
Mo hinh-3-lop
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Com201 slide 1
BÀI 6: Thủ tục (SUB) và hàm (FUNCTION) - Giáo trình FPT
Cơ sở dữ liệu PTIT slide 2
Ad

Similar to Cai tien trong lenh t sql cua sql server 2008 (2) (20)

PDF
Chuan viet code va thiet ke giao dien trong C#
DOCX
Trong bài viết hôm nay
PPT
slide_Chuong 3_ (1).ppt
PDF
môn học cơ sở dữ liệu trong sql học viện PTIT
DOCX
6.adapterset
PDF
V1_CSDL_Chương 4 - Ngôn ngữ lập trình trong hệ quản trị cơ sở dữ liệu.pdf
PDF
Co So du lieu chuong 4 truong Dai Hoc hcm
PDF
C4.SQL-LapTrinhT_SQL.pdfddadadsadadsdadd
PPT
PDF
csdl bai-thuchanh_01
PPT
View sp trigger_udf
PDF
Chương 3 Ngôn ngữ truy vấn có cấu trúc (SQL)
PDF
Báo cáo ATTT CÁC DẠNG TẤN CÔNG SQL INJECTION
DOC
PPT
02 access
DOC
Vb6 16 (1)
DOCX
Tip oracle
DOC
Tailieu.vncty.com giao-trinh-sql-2000
ODP
Android Nâng cao-Bài 4: Content Provider
Chuan viet code va thiet ke giao dien trong C#
Trong bài viết hôm nay
slide_Chuong 3_ (1).ppt
môn học cơ sở dữ liệu trong sql học viện PTIT
6.adapterset
V1_CSDL_Chương 4 - Ngôn ngữ lập trình trong hệ quản trị cơ sở dữ liệu.pdf
Co So du lieu chuong 4 truong Dai Hoc hcm
C4.SQL-LapTrinhT_SQL.pdfddadadsadadsdadd
csdl bai-thuchanh_01
View sp trigger_udf
Chương 3 Ngôn ngữ truy vấn có cấu trúc (SQL)
Báo cáo ATTT CÁC DẠNG TẤN CÔNG SQL INJECTION
02 access
Vb6 16 (1)
Tip oracle
Tailieu.vncty.com giao-trinh-sql-2000
Android Nâng cao-Bài 4: Content Provider
Ad

Cai tien trong lenh t sql cua sql server 2008 (2)

  • 1. “Chuyên trang dành cho kỹ thuật viên tin học” CHIA SẺ - KINH NGHIỆM - HỌC TẬP - THỦ THUẬT Cải tiến trong lệnh T-SQL của SQL Server 2008 (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 các tham số. Sử dụng TVP có các lợi ích sau, không sử dụng khóa cho mẫu dữ liệu ban đầu từ máy trạm, không cần phải biên tập lại lệnh, giảm truy cập tới máy chủ, cho phép máy trạm chỉ định thứ tự sắp xếp và những khóa chính, … Khi các biến của bảng được được chuyển tác như những tham số thì bảng này sẽ được hiên thực hóa trong cơ sở dữ liệu hệ thống tempdb hơn là chuyển tác toàn bộ nhóm dữ liệu trong bộ nhớ, điều này giúp việc xử lý với lượng dữ liệu lớn hiệu quả hơn. Mọi máy chủ thực hiện chuyển tác các tham số biến thiên của bảng được chuyển tác bởi tham chiếu, sử dụng tham chiếu này như một con trỏ tới bảng đó trong tempdb để tránh tạo bản sao cho dữ liệu đầu vào. Ứng dụng Các lập trình viên luôn gặp phải rắc rối khi chuyển nhiều bản ghi trong cơ sở dữ liệu để tận dụng tối đa khả năng thực thi. Ví dụ, khi một lập trình viên cần lập trình cho trang chấp nhận thứ tự gồm nhiều mục thì họ sẽ phải viết theo logic riêng để nhóm mọi lệnh chèn thàng một chuỗi định giới hay kiêu XML (OPENXML trong SQL Server 2000) rồi chuyển những giá trị văn bản đó sang một thủ tục hay lệnh. Thao tác này yêu cầu thủ tục hay lệnh đó phải có logic cần thiết cho việc tháo nhóm những giá trị và làm cho những cấu trúc dữ liệu có hiệu lực, sau đó tiến hành chèn các bản ghi. Quá nhiều thao tác cần thực hiện nhưng lại không tối ưu, trong trường hợp này chúng ta có thể sử dụng TVP để chuyển một bảng dữ liệu gồm nhiều bản ghi từ ứng dụng .NET sang SQL Server và chèn trực tiếp vào bảng mà không phải thực hiện thêm bất kì thao tác nào tại máy chủ này. 1 of 9
  • 2. Hạn chế 1. UDTT tồn tại một số hạn chế, ví dụ nó không thể sử dụng như một cột trong bản, định dạng bảng không thể thay đổi sau khi đã được tạo, một giá trị mặc định không thể được chỉ định trong đị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 INSERT INTO [Customers] (FirstName, LastName, Email) VALUES('AAA','XYZ', 'aaa@test.com') INSERT INTO [Customers] (FirstName, LastName, Email) VALUES('BBB','XYZ', 'bbb@test.com') INSERT INTO [Customers] (FirstName, LastName, Email) VALUES('CCC','XYZ', 'bbb@test.com') GO Tiếp theo chúng ta sẽ tạo một UDTT khi đã tạo thành công chúng ta có thể xem chi tiết bảng sử dụng hai System Catalog View: 2 of 9
  • 3. --Tạo một UDTT lưu trữ các bản ghi khách hàng CREATE TYPE [CustomersUDT] AS TABLE ( [FirstName] [varchar](100)NOT NULL, [LastName] [varchar](100)NOT NULL, [Email] [varchar](200) NOTNULL ) GO --Chúng ta có thể sử dụng các Catalog View để xem bảng được tạo SELECT name, system_type_id, user_type_id, is_assembly_type, is_table_type FROM SYS.TYPES WHERE is_table_type = 1 SELECT name, system_type_id, user_type_id, is_assembly_type, is_table_type FROM SYS.TABLE_TYPES GO Chúng ta cũng có thể sử dụng SQL Server Management Studio (SSMS) để xem các bảng người dùng định nghĩa đã được tạo trong một cơ sở dữ liệu, truy cập vào node User-Defined Table Types trong node Types cửa bảng Object Explorer. 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. 3 of 9
  • 4. 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"] = "aaa@test.com"; dtCustomers.Rows.Add(drCustomer); //Chèn customer 2 drCustomer = dtCustomers.NewRow(); drCustomer["FirstName"] = "BBB"; drCustomer["LastName"] = "XYZ"; drCustomer["Email"] = "bbb@test.com"; dtCustomers.Rows.Add(drCustomer); //Chèn customer 3 drCustomer = dtCustomers.NewRow(); drCustomer["FirstName"] = "CCC"; drCustomer["LastName"] = "XYZ"; drCustomer["Email"] = "ccc@test.com"; dtCustomers.Rows.Add(drCustomer); //Tạo đối tượng Connection để kết nối tới máy chủ/cơ sở dữ liệu SqlConnection conn = new SqlConnection("Data Source=ARALI-LAPTOP;Initial Catalog=tempdb;Integrated Security=true"); conn.Open(); //Tạo một đối tượng Command gọi thủ tục lưu trữ SqlCommand cmdCustomer = new SqlCommand("AddCustomers", conn); cmdCustomer.CommandType = CommandType.StoredProcedure; 4 of 9
  • 5. //Tạo một tham số sử dụng SQL DB type viz. Structured mới để chuyển đổi như tham số giá trị bảng SqlParameter paramCustomer = cmdCustomer.Parameters.Add("@CustomersTVP", SqlDbType.Structured); paramCustomer.Value = dtCustomers; //Chạy truy vấn cmdCustomer.ExecuteNonQuery(); Kiểu dữ liệu Date và Time mới Trường hợp ứng dụng thực 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 SQL Server 2008 vấn đề này đã được khắc phục, giờ đây chúng ta có thể lưu trữ cùng loại thông tin với dung lượng chiếm dụng ít hơn nhiều (khoảng 290MB trong ví dụ trên, chỉ lưu trữ ngày) bằng cách chỉ lưu trữ ngày hoặc giờ. Không chỉ có vậy, những kiểu dữ liệu mới này sẽ có một vùng rộng hơn, thời gian được chia nhỏ tới đơn vị nano giây (một phần tỷ giây), và cho phép lưu trữ khoảng trống múi giờ với dữ liệu đó. SQL Server 2008 giới thiệu 4 kiểu dữ liệu DATETIME mới bao gồm: DATE Trong các phiên bản SQL Server trước, chúng ta phải sử dụng kiểu dữ liệu DATETIME hay SMALLDATETIME cho dù chúng ta chỉ cần lưu trữ Date. Những kiểu dữ liệu này lưu trữ thời gian như một thành phần của nó. Sau đó chúng ta cần phải định dạng dữ liệu kết xuất để chỉ hiện thị thành phần ngày. SQL Server 2008 giới thiệu kiểu dữ liệu DATE rất hữu dụng trong việc lưu trữ ngày. Nó hỗ trợ lịch Gregorian và sử dụng 3 byte để lưu trữ ngày. Vùng của kiểu dữ liệu DATE từ 01-01-0001 tới 12-31-9999, trong khi kiểu dữ liệu DATETIME có vùng từ 01-01-1753 tới 31-12-9999 và SMALLDATETIME từ 01-01-1900 tới 06-06-2079. CREATE TABLE Employee ( EmpId INT IDENTITY, Name VARCHAR(100), DOB DATE, -- Date of birth column will store only date and no time part DOJ DATE DEFAULT GETDATE()--Date of joining will be default, again only date, no time part ) GO --Tạo một biến DATE rồi gán một giá trị ngày DECLARE @DOB DATE = CONVERT(DATE,'12/05/1982') 5 of 9
  • 6. INSERT INTO Employee(Name, DOB) VALUES ('Rocky', @DOB) GO SELECT * FROM Employee GO TIME Giống với kiểu dữ liệu Date, trong SQL Server 2008 giới thiệu một kiểu dữ liệu TIME được sử dụng trong trường hợp chỉ cần lưu trữ thời gian. Vùng dữ liệu TIME trong khoảng 00:00:00.0000000 tới 23:59:59.9999999. Độ chính xác của kiểu dữ liệu TIME lên đến 100 nano giây, tuy nhiên chúng ta có thể giảm giá trị này để tiết kiệm bộ nhớ (khoảng 3 đến 5 byte). Kiểu dữ liệu này không nhận biết được múi giờ, và nó sử dụng hệ 24 giờ. CREATE TABLE ShiftMaster ( ShiftName VARCHAR(100), StartTime TIME, -- StartTime without storing date component EndTime TIME -- EndTime without storing date component ) GO --Khai báo biến TIME để lưu trữ thời gian DECLARE @StartTime TIME = '00:01' DECLARE @EndTime TIME = '08:00' INSERT INTO ShiftMaster(ShiftName, StartTime, EndTime) VALUES ('Shift A', @StartTime, @EndTime), ('Shift B','08:01', '04:00'), ('Shift C','04:01', '00:00') GO SELECT * FROM ShiftMaster GO DATETIMEOFFSET Đây là một kiểu dữ liệu mới khác của SQL Server 2008. Nhờ kiểu dữ liệu này chúng ta có thể lưu trữ ngày/giờ với độ chính xác rất cao. Dù chúng ta không thể lưu trữ múi giờ như Eastern Time, Central Time, … nhưng chúng ta có thể lưu trữ offset -5:00 cho Eastern Standard Time và -6:00 cho Central Standard Time, … Vùng dữ liệu Date trong khoảng từ 01-01-0001 tới 12-31-9999, vùng Time trong khoảng 00:00:00 tới 23:59:59.9999999. Vùng Offset trong khoảng từ -14:00 đến +14:00. Độ chính 6 of 9
  • 7. xác của dữ liệu có thể được cài đặt thủ công theo lịch Gregorian. DATETIMEOFFSET định nghĩa một ngày mà được kết hợp với một khoảng thời gian của một ngày khác nhận biết được múi giờ và dựa trên hệ giờ 24 giờ. CREATE TABLE OrderMaster ( OrderID INT IDENTITY, CustomerID INT, OrderDateTIme DATETIMEOFFSET--DATETIMEOFFSET data type to store date and time along with the time-zone offset ) GO --Khai báo biến DATETIMEOFFSET để lưu trữ ngày và giờ cùng với Offset múi giờ DECLARE @OrderDateTIme DATETIMEOFFSET= '2009-01-16 00:24 +05:30' INSERT INTO OrderMaster(CustomerID, OrderDateTIme) VALUES (1, @OrderDateTIme), (1,'2009-01-18 00:24 +05:30'), (2,'2009-01-18 00:24 -04:00') GO SELECT * FROM OrderMaster GO DATETIME2 Lí do SQL Server 2008 giới thiệu kiểu dữ liệu DATETIME2 là do kiểu dữ liệu DATETIME không phù hợp với chuẩn SQL, và DATETIME không hoàn toàn tương thích với kiểu dữ liệu .NET DATETIME. Về cơ bản DATETIME2 là sự kết hợp của kiểu dữ liệu DATE và TIME mới và sử dụng 6 đến 8 byte. Kích thước thực được xác định bởi mức độ chính xác của dữ liệu được lưu trữ, ví dụ, DATETIME(0) sẽ sử dụng 6 byte, DATETIME(3) sẽ sử dụng 7 byte trong khi đó DATETIME(7) mặc định sử dụng 8 byte (con số bên trong dấu ngoặc cho biết độ chính xác của thông tin, và bạn có thể thay đổi giá trị này trong khoảng 0 đến 7). DATETIME2 chấp nhận nhiều định dạng chuỗi. Kiểu dữ liệu này cũng sử dụng lịch Gregorian, và chúng ta không thể chỉ định múi giờ trong kiểu dữ liệu này. Ngoài những thay đổi trong kiểu dữ liệu, SQL Server 2008 còn giới thiệu 5 hàm mới, gồm SYSDATETIME, SYSDATETIMEOFFSET, SYSUTCDATETIME, SWITCHOFFSET và TODATETIMEOFFSET. Hàm SYSDATETIME trả về thời gian hiện tại của hệ thống mà không có múi giờ với độ chính xác 10 mili giây. Hàm SYSDATETIMEOFFSET giống với hàm SYSDATETIME, tuy nhiên hàm này bao gồm cả múi giờ. Hàm SYSUTCDATETIME trả về ngày và giờ Universal Coordinated Time (giống với Greenwich Mean 7 of 9
  • 8. Time) với độ chính xác 10 mili giây. Thời gian này được lấy từ thời gian cục bộ hiện thời và cài đặt múi giờ của máy chủ nơi SQL Server đang vận hành. Hai hàm SYSDATETIME và SYSUTCDATETIME đều trả về kiểu dữ liệu DATETIME2, trong khi đó hàm SYSDATETIMEOFFSET trả về kiểu dữ liệu DATETIMEOFFSET. Hàm SWITCHOFFSET trả về một giá trị DATETIMEOFFSET được thay đổi từ múi giờ lưu trữ Offset tới một múi giờ Offset mới cụ thể. Hàm TODATETIMEOFFSET chuyển đổi một ngày cục bộ hay giá thời gian và một múi giờ Offset cuh thể tới một giá trị DATETIMEOFFET. SELECT GETDATE()AS [GETDATE], --Trả về hời gian hiện tại của hệ thống mà không có múi giờ với độ chính xác là 10 mili giây. SYSDATETIME() AS [SYSDATETIME], --Trả về ngày và giờ Universal Coordinated Time với độ chính xác 10 mili giây. SYSUTCDATETIME() AS [SYSUTCDATETIME] SELECT --Trả về thời gian hiện tại của hệ thống kèm múi giờ với độ chính xác 10 mili giây SYSDATETIMEOFFSET() AS [SYSDATETIMEOFFSET], --Trả về giá trị DATETIMEOFFSET được thay đổi từ múi giờ được lưu trữ Offset tới một múi giờ được lưu trữ Offset mới được chỉ định và giữ nguyên giá trị ban đầu SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:00')AS [SWITCHOFFSET], --Chuyển đổi giá trị ngày hay giờ cục bộ và một múi giờ Offset được chỉ định tới một giá trị DATETIMEOFFSET TODATETIMEOFFSET(GETDATE(),'+05:30') AS [TODATETIMEOFFSET] Kết luận UDTT và TVP cho phép người dùng chuyển một nhóm kết quả tới một thủ tục và lưu nhiều giá trị trả về tới máy chủ cần sử dụng trong các phiên bản trước đó của SQL Server. Những kiểu dữ liệu Date và Time mới trong SQL Server 2008 giúp tiết kiệm bộ nhớ vì chiếm dụng ít hơn trong trường hợp chỉ lưu ngày hoặc giờ (chính xác hơn), giúp quá trình làm việc với các dữ liệu này dễ dàng hơn, và cho phép làm việc với DATETIMEOFFSET. 8 of 9
  • 9. Trong phần tới chúng ta sẽ tìm hiểu kiểu dữ liệu mới HIERARCHYID cho phép lưu cấu trúc phân cấp trong cơ sở dữ liệu. Xian (Theo SQLServerCentral) Công ty TNHH đầu tư phát triển tin học GC Com Chuyên trang kỹ thuật máy vi tính cho kỹ thuật viên tin học Điện thoại: (073) - 3.511.373 - 6.274.294 Website: http://www.gccom.net 9 of 9