sql server nang cao trich dan

Upload: xangvo

Post on 07-Jul-2018

230 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    1/58

    Hướng dẫn làm việc với viewNhư bạn đã thấy xuyên suốt cuốn sách này, truy vấn SELECT có thể phức tạp, đặc biệtkhi chúng sử dụng nhiều phép nối, truy vấn con, hoặc hàm phức tạp. Vì vậy, có thể bạnmuốn lưu những truy vấn thường xuyên sử dụng. Để thực hiện bạn có thể lưu trữ câulệnh vào le sử dụng Management Studio hoặc tạo view (khung nhìn).

    Không giống le bạn tạo bằng Management Studio, view được lưu trữ như mộtphần của cơ sở dữ liệu. Có nghĩa là, view có thể được sử dụng không chỉ bởi các lập

    trình viên SQL mà còn bởi cả người dùng và các chương trình ứng dụng truy cập vàocơ sở dữ liệu. Rõ ràng, điều này đem lại một số lợi ích so với việc sử dụng bảng mộtcách trực tiếp, như bạn sẽ thấy ở chương này.

    1

    Giới thiệu view ..........................................................................................................2

    Cách view làm việc .....................................................................................................2Lợi ích của việc sử dụng view ....................................................................................4

    Hướng dẫn tạo và quản lý view ...............................................................................6

    Hướng dẫn tạo view ...................................................................................................6

    Các ví dụ tạo view.......................................................................................................8Hướng dẫn tạo view có thể cập nhật ........................................................................10Hướng dẫn xóa hoặc chỉnh sửa view .......................................................................12

    Hướng dẫn sử dụng view ......................................................................................14

    Hướng dẫn cập nhật hàng thông qua view...............................................................14Hướng dẫn chèn hàng thông qua view.....................................................................16Hướng dẫn xóa hàng thông qua view.......................................................................16Hướng dẫn sử dụng catalog view .............................................................................18

    Hướng dẫn sử dụng View Designer .....................................................................20

    Hướng dẫn tạo hoặc chỉnh sửa view ........................................................................20Hướng dẫn xóa view.................................................................................................20

    Tổng kết ..................................................................................................................22

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    2/58

    2  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Giới thiệu view

    Ở Chương 1 cuốn "SQL Server 2008 căn bản - Hướng dẫn học qua ví dụ", bạn

    đã làm quen với những kiến thức cơ bản về cách view làm việc. Mục dưới đây chỉnhắc lại thông tin này. Sau đó, sẽ trình bày một số lợi ích của view, giúp bạn nắmrõ khi nào và tại sao nên sử dụng chúng.

    Cách view làm việc

    View (khung nhìn) là một câu lệnh SELECT được lưu trữ trong cơ sở dữ liệu. Để tạo một view, bạn sử dụng câu lệnh CREATE VIEW như minh họa ở Hình 1-1.Câu lệnh này tạo một view với tên VendorsMin, truy xuất các cột VendorName,

    VendorState, và VendorPhone từ bảng Vendors.Bạn có thể coi view như một bảng ảo chỉ chứa các hàng, cột được chỉ định

    trong câu lệnh CREATE VIEW của nó. Bảng hoặc các bảng được liệt kê trongmệnh đề FROM được gọi là bảng cơ sở (base table) của view. Do view tham chiếulại các bảng cơ sở, nên nó không lưu trữ bất kỳ dữ liệu nào, và luôn phản ánh dữliệu hiện thời của các bảng cơ sở.

     Để sử dụng view, bạn gọi tới view từ câu lệnh SQL khác. Ví dụ, câu lệnhSELECT trong hình minh họa, sử dụng view VendorsMin trong mệnh đề FROMthay cho một bảng. Kết quả là, câu lệnh SELECT này lấy về tập kết quả của nó từbảng ảo mà view định nghĩa. Trong trường hợp trên, toàn bộ hàng của nhà cungcấp ở California được truy xuất từ view.

    Vì view được lưu trữ như một đối tượng trong cơ sở dữ liệu, nó có thể đượcsử dụng bởi bất kỳ người nào truy cập vào cơ sở dữ liệu, bao gồm người dùng truycập vào cơ sở dữ liệu thông qua chương trình người dùng cuối, như các chươngtrình cung cấp truy vấn ad-hoc và sinh báo cáo, và các chương trình ứng dụng đặcbiệt được viết để làm việc với dữ liệu trong cơ sở dữ liệu. Thực tế, view thườngđược thiết kế để sử dụng với các loại chương trình này. Ở mục tới, bạn sẽ tìm hiểurõ lý do tại sao.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    3/58

    Chương 1 Hướng dẫn làm việc với view 3

    Câu lệnh CREATE VIEW tạo một view được đặt tên VendorsMinCREATE VIEW VendorsMin AS

      SELECT VendorName, VendorState, VendorPhone

      FROM Vendors

    Bảng ảo được biểu diễn bởi view

    (122 hàng)

    Câu lệnh SELECT sử dụng view VendorsMinSELECT * FROM VendorsMin

    WHERE VendorState = 'CA'

    ORDER BY VendorName

    Tập kết quả trả về bởi câu lệnh SELECT

    (75 hàng)

    Tóm lược• Mỗi view  chứa một câu lệnh SELECT được lưu trữ như một đối tượng trong cơ

    sở dữ liệu. Bảng được viết trong câu lệnh SELECT tạo view được gọi là bảng cơsở  của view.

    • Truy vấn tạo view được tối ưu bởi SQL Server trước khi lưu vào cơ sở dữ liệu. Sauđó, trong bất kỳ câu lệnh thao tác dữ liệu nào như SELECT, INSERT, UPDATE, và

    DELETE, bạn có thể gọi tên view ở bất cứ nơi nào mà bạn thường sử dụng bảng.• Dù vận hành như một bảng ảo, view không lưu trữ bất kỳ dữ liệu nào. Do view

    tham chiếu trở lại các bảng cơ sở của nó, view luôn trả về dữ liệu hiện thời.

    • View có thể được là bảng khung nhìn (viewed table), vì nó cung cấp một khungnhìn cho các bảng cơ sở bên dưới.

    Hình 1-1 Cách view làm việc

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    4/58

    4  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Lợi ích của việc sử dụng view

    Hình 1-2 mô tả một số lợi ích của việc sử dụng view. Để bắt đầu, dữ liệu bạntruy cập thông qua một view không phụ thuộc vào cấu trúc cơ sở dữ liệu. Để minh

    họa, giả sử câu lệnh tạo view gọi đến một bảng mà bạn vừa quyết định chia làmhai bảng. Để thích nghi với thay đổi này, bạn chỉ cần chỉnh sửa view mà không cầnphải chỉnh sửa bất kỳ câu lệnh nào gọi đến view. Điều này có nghĩa là, người dùngtruy vấn cơ sở dữ liệu sử dụng view không cần biết sự thay đổi trong cấu trúc cơsở dữ liệu, và các chương trình ứng dụng sử dụng view không cần phải chỉnh sửa.

    Bạn cũng có thể sử dụng view để hạn chế truy cập đến một cơ sở dữ liệu. Để thực hiện, bạn chỉ cần đưa các hàng và cột muốn người dùng hay chươngtrình ứng dụng có thể truy cập vào trong view. Sau đó, hãy cho người dùng hoặcchương trình truy cập dữ liệu thông qua view. Ví dụ, view được hiển thị ở hình minhhọa đã hạn chế truy cập vào một bảng chứa thông tin về các nhà đầu tư. Trongtrường hợp này, view cung cấp truy cập đến tên và thông tin địa chỉ cần cho nhânviên hỗ trợ duy trì nội dung bảng. Ngược lại, một view khác bao gồm thông tin đầutư mà các cố vấn viên, là người quản lý đầu tư có thể sử dụng.

    Ngoài ra, view cũng có tính linh động. Vì view có thể được tạo thành từ phầnlớn mọi câu lệnh SELECT, nên chúng có thể được dùng để chỉ cung cấp dữ liệucần thiết cho các tình huống đặc biệt. Ngoài ra, view có thể ẩn đi tính phức tạpcủa câu lệnh SELECT do đó giúp người dùng cuối và chương trình ứng dụng truyxuất dữ liệu cần thiết dễ dàng hơn. Cuối cùng, view được sử dụng không chỉ đểtruy xuất mà còn để cập nhật dữ liệu. Bạn sẽ thấy cách thực hiện ở phần sau của

    chương này.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    5/58

    Chương 1 Hướng dẫn làm việc với view 5

    Một số lợi ích mà view mang lại

    Lợi ích Mô tả

     Độc lập về

    thiết kế

    Dữ liệu được truy cập thông qua một view độc lập với kiến trúc cơ sở dữ liệu

    bên dưới. Điều này có nghĩa là, bạn có thể thay đổi thiết kế cơ sở dữ liệu, sauđó chỉnh sửa view nếu cần mà không phải thay đổi truy vấn sử dụng view đó.

    Bảo mậtdữ liệu

    Bạn có thể tạo view để chỉ cung cấp truy cập cho một số người dùng cụ thể truycập đến dữ liệu mà người đó được phép.

    Tính linhđộng

    Bạn có thể tùy biến cách tạo view để thích nghi với những nhu cầu khác nhau.

     Đơn giảnhóa truy vấn

    Bạn có thể tạo view nhằm ẩn đi tính phức tạp của các thao tác truy xuất dữ liệu.Sau đó, dữ liệu có thể được truy xuất về bằng những câu lệnh SELECT đơn giản.

    Khả năngcập nhật

    View cũng có thể được sử dụng để cập nhật, chèn và xóa dữ liệu từ một bảngcơ sở nhưng có một số hạn chế nhất định.

    Dữ liệu lưu trong bảng Investors chứa thông tin về các nhà đầu tư 

    (5 hàng)

    View giới hạn truy cập vào một số cộtCREATE VIEW InvestorsGeneral

    AS

    SELECT InvestorID, LastName, FirstName, Address,

    City, State, ZipCode, Phone

    FROM Investors

    Dữ liệu được truy xuất qua view

    (5 hàng)

    Tóm lược

    • Bạn có thể tạo một view dựa trên hầu hết mọi câu lệnh SELECT. Có nghĩa là, bạn

    có thể viết mã câu lệnh SELECT tạo view chứa phép kết nối bảng, tổng hợp dữliệu, đồng thời sử dụng các truy vấn con và hàm.

    • Bạn có thể giới hạn truy cập tới dữ liệu trong bảng bằng cách bao gồm các cột chophép người dùng truy cập trong mệnh đề SELECT của view, hoặc bao gồm mộtmệnh đề WHERE trong câu lệnh SELECT để chỉ truy xuất những hàng đã chọn.

    Hình 1-2 Lợi ích của việc sử dụng view

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    6/58

    6  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Hướng dẫn tạo và quản lý view

     Đến đây, khi đã hiểu cách view làm việc và những lợi ích mà chúng mang lại,

    bạn đã sẵn sàng để học cách tạo và quản lý view. Bạn sẽ tìm hiểu nội dung này ởcác mục sau.

    Hướng dẫn tạo view

    Hình 1-3 biểu diễn câu lệnh CREATE VIEW dùng để tạo view. Ở dạng đơngiản nhất, bạn viết tên view trong mệnh đề CREATE VIEW sau từ khóa AS, tiếptheo là câu lệnh SELECT định nghĩa view. Ví dụ, câu lệnh trên hình minh họa tạora một view có tên VendorShortList. View này bao gồm các cột được chọn từ bảng

    Vendors cho tất cả nhà cung cấp có hóa đơn. Khi thực thi câu lệnh, view đượcthêm vào cơ sở dữ liệu hiện thời, và một thông điệp như trong hình minh họa sẽhiển thị thông báo câu lệnh thành công.

    Vì mỗi câu lệnh SELECT có thể gọi đến một view, câu lệnh SELECT bạn viếtmã bên trong định nghĩa của view có thể tham chiếu tới một view khác. Nói cáchkhác, view có thể được lồng (nested) vào nhau. Tuy nhiên, bạn nên tránh sử dụngview lồng (nested view), vì các phụ thuộc giữa bảng và view có thể trở nên khóhiểu, gây khó khăn trong việc phát hiện vấn đề.

    Câu lệnh SELECT tạo view có thể sử dụng bất kỳ tính năng nào của một câulệnh SELECT bình thường với hai ngoại lệ. Thứ nhất, câu lệnh SELECT không thểbao gồm một mệnh đề ORDER BY, trừ khi nó cũng sử dụng từ khóa TOP. Có nghĩalà, nếu muốn sắp xếp tập kết quả được trích ra từ một view, bạn phải bao gồm mộtmệnh đề ORDER BY trong câu lệnh SELECT lấy dữ liệu từ view. Thứ hai, câu lệnhSELECT không thể bao gồm từ khóa INTO, vì không thể dùng view để tạo ra mộtbảng vĩnh cửu.

    Theo mặc định, cột trong view sẽ có tên trùng với tên cột trong bảng cơ sở.Tuy nhiên, nếu view chứa cột được tính toán, bạn sẽ muốn đặt tên cột đó như đãlàm trong những câu lệnh SELECT thông thường. Ngoài ra, bạn cần đổi tên cáccột trùng tên của những bảng cơ sở khác nhau. Để thực hiện, bạn có thể sử dụng

    mệnh đề AS trong câu lệnh SELECT, hoặc viết các tên cột trong mệnh đề CREATEVIEW. Bạn sẽ thấy ví dụ về cả hai kỹ thuật này ở hình minh họa tiếp theo.Câu lệnh CREATE VIEW cũng cung cấp ba mệnh đề tùy chọn: WITH

    ENCRYPTION, WITH SCHEMABINDING và WITH CHECK OPTION. Mệnh đềWITH ENCRYPTION ngăn những người dùng khác xem câu lệnh SELECT tạoview. Nói chung, bạn không cần sử dụng tùy chọn này, trừ khi hệ thống của bạnđòi hỏi tăng cường tính bảo mật.

    Mệnh đề WITH SCHEMABINDING bảo vệ view bằng cách liên kết nó với cấutrúc cơ sở dữ liệu, hay còn gọi là schema. Việc làm này ngăn chặn các bảng cơsở bên dưới không bị xóa hoặc chỉnh sửa bằng bất cứ cách nào ảnh hưởng đến

    view. Bạn sẽ sử dụng lựa chọn này cho cơ sở dữ liệu thực tế, chứ không phải chocơ sở dữ liệu bạn đang dùng để kiểm thử.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    7/58

    Chương 1 Hướng dẫn làm việc với view 7

    Cú pháp của câu lệnh CREATE VIEWCREATE VIEW ten_view [(ten_cot_1 [, ten_cot_2]…)]

    [WITH {ENCRYPTION|SCHEMABINDING|ENCRYPTION, SCHEMABINDING}]

    AS

    cau_lenh_select

    [WITH CHECK OPTION]

    Câu lệnh CREATE VIEW tạo một view của các nhà cung cấp cóhóa đơn

    CREATE VIEW VendorShortList

    AS

    SELECT VendorName, VendorContactLName, VendorContactFName, VendorPhone

    FROM Vendors

    WHERE VendorID IN (SELECT VendorID FROM Invoices)

    Phản hồi từ hệ thốngCommand(s) completed successfully.

    Tóm lược• Bạn sử dụng câu lệnh CREATE VIEW để tạo một view. Tên bạn cung cấp cho view

    không được trùng với tên của bất kỳ bảng hoặc view nào đang tồn tại.

    • Câu lệnh SELECT tạo view có thể gọi đến 256 bảng, và có thể sử dụng mọi kếthợp giữa các phép nối, hợp, hoặc truy vấn con hợp lệ.

    • Bạn có thể tạo view dựa trên một view khác thay vì bảng. View này được gọi làview lồng . Các view trong SQL Server có thể được lồng vào nhau tới 32 mức.

    • Câu lệnh SELECT tạo view không thể bao gồm mệnh đề INTO, và không thể baogồm mệnh đề ORDER BY trừ khi từ khóa TOP cũng được sử dụng. Để sắp xếpcác hàng trong một view, bạn phải bao gồm mệnh đề ORDER BY trong câu lệnhSELECT lấy dữ liệu từ view đó.

    • Bạn có thể đặt tên cột trong mỗi view bằng cách viết một danh sách tên nằm trongdấu ngoặc đơn ngay sau tên view, hoặc bằng cách viết các tên mới trong mệnhđề SELECT. Phải đặt tên cột nếu cột đó được tính toán từ các cột khác, hoặc nếu

    một cột trùng tên đã tồn tại. Ngoài ra, tên của cột trong bảng cơ sở có thể được sửdụng theo mặc định.

    • Bạn có thể sử dụng mệnh đề WITH ENCRYPTION để ngăn người dùng không choxem mã SQL định nghĩa view.

    • Bạn có thể sử dụng mệnh đề WITH SCHEMABINDING để liên kết một view vớischema cơ sở dữ liệu. Sau đó, bạn không thể xóa các bảng mà view dựa trên hoặcchỉnh sửa những bảng gây ảnh hưởng tới view.

    • Nếu bao gồm mệnh đề WITH SCHEMABINDING, bạn không thể sử dụng ký hiệutất cả các cột (*) trong câu lệnh SELECT. Ngoài ra, bạn phải chỉ ra tên các bảng và

    view trong mệnh đề FROM cùng với tên của schema chứa chúng.• Bạn có thể sử dụng mệnh đề WITH CHECK OPTION để ngăn một hàng khỏi bị cập

    nhật thông qua một view nếu sau thao tác này hàng đó không còn được bao gồmtrong view nữa. Xem chi tiết ở Hình 1-7.

    Hình 1-3 Hướng dẫn tạo view

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    8/58

    8  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Mệnh đề WITH CHECK OPTION ngăn một hàng trong view khỏi bị cập nhậtnếu việc làm này khiến hàng bị loại khỏi view. Mệnh đề này sẽ được trình bày thêmở phần cập nhật các hàng sử dụng một view.

    Các ví dụ tạo view Để giúp bạn hiểu được tính linh động mà view mang lại, Hình 1-4 biểu diễn

    một số câu lệnh CREATE VIEW. Câu lệnh đầu tiên tạo một view kết nối dữ liệu từbảng Vendors và Invoices. Câu lệnh thứ hai tạo một view truy xuất năm phần trămhóa đơn (năm phần trăm số hàng) đầu tiên trong bảng Invoices. Chú ý, câu lệnhSELECT này bao gồm một mệnh đề ORDER BY sắp xếp các hàng theo thứ tựgiảm dần để những hóa đơn có tổng số tiền hóa đơn lớn nhất được truy xuất. Đâylà trường hợp duy nhất bạn có thể sử dụng mệnh đề ORDER BY.

    Câu lệnh thứ ba và thứ tư minh họa hai cách bạn có thể đặt tên các cột trongview. Ở cả hai trường hợp, câu lệnh SELECT truy xuất một cột được tính toán,vì thế cột này phải được gán tên. Câu lệnh thứ ba chỉ ra cách bạn thực hiện việcnày sử dụng mệnh đề CREATE VIEW. Chú ý, ngay cả khi bạn chỉ muốn đặt têncho một cột, bạn vẫn phải bao gồm tên cho toàn bộ cột, thậm chí nếu chúng trùngvới tên trong các bảng cơ sở. Ngược lại, nếu muốn đặt tên cột này trong mệnh đềSELECT như ví dụ thứ tư, bạn có thể để những cột khác có tên mặc định là tên cáccột trong bảng cơ sở. Vì cú pháp này dễ sử dụng hơn, nên bạn sẽ thường dùng nó.Lưu ý, chuẩn ANSI không hỗ trợ cú pháp này cho việc đặt tên cột view.

    Câu lệnh thứ năm tạo một view tổng hợp các hàng trong bảng Invoices theo

    nhà cung cấp. Câu lệnh này minh họa cách sử dụng hàm tổng hợp (aggregatefunction) và mệnh đề GROUP BY trong một view. Trong trường hợp này, hàngđược nhóm theo tên nhà cung cấp, đếm số lượng các hóa đơn và tính toán tổngsố tiền hóa đơn của mỗi nhà cung cấp.

    Tương tự câu lệnh đầu tiên, câu lệnh cuối cùng kết nối dữ liệu từ bảng Vendorsvà bảng Invoices. Không như câu lệnh thứ nhất, câu lệnh này bao gồm mệnh đềWITH SCHEMABINDING. Có nghĩa là, cả bảng Vendors và Invoices đều khôngthể bị xóa mà không xóa view trước. Bên cạnh đó, không thay đổi nào trên cácbảng ảnh hưởng tới view. Chú ý, các tên bảng trong mệnh đề FROM đi kèm vớitên schema của bảng, trong trường hợp này là dbo. Nếu bao gồm mệnh đề WITHSCHEMABINDING, bạn phải viết các tên bảng theo cách này.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    9/58

    Chương 1 Hướng dẫn làm việc với view 9

    Câu lệnh CREATE VIEW sử dụng phép nối bảngCREATE VIEW VendorInvoices

    AS

    SELECT VendorName, InvoiceNumber, InvoiceDate, InvoiceTotal

    FROM Vendors JOIN Invoices ON Vendors.VendorID = Invoices.VendorID

    Câu lệnh CREATE VIEW sử dụng mệnh đề TOP và ORDER BYCREATE VIEW TopVendors

    AS

    SELECT TOP 5 PERCENT VendorID, InvoiceTotal

    FROM Invoices

    ORDER BY InvoiceTotal DESC

    Hai câu lệnh CREATE VIEW đặt tên cho các cột của view

    Câu lệnh đặt tên cho toàn bộ cột của view trong mệnh đề CREATE VIEW

    CREATE VIEW OutstandingInvoices

    (InvoiceNumber, InvoiceDate, InvoiceTotal, BalanceDue)

    AS

    SELECT InvoiceNumber, InvoiceDate, InvoiceTotal,

      InvoiceTotal - PaymentTotal - CreditTotal

    FROM Invoices

    WHERE InvoiceTotal - PaymentTotal - CreditTotal > 0

    Câu lệnh đặt tên chỉ mình cột được tính toán trong mệnh đề SELECTCREATE VIEW OutstandingInvoices

    ASSELECT InvoiceNumber, InvoiceDate, InvoiceTotal,

      InvoiceTotal - PaymentTotal - CreditTotal AS BalanceDue

    FROM Invoices

    WHERE InvoiceTotal - PaymentTotal - CreditTotal > 0

    Câu lệnh CREATE VIEW tổng hợp hóa đơn theo nhà cung cấpCREATE VIEW InvoiceSummary

    AS

    SELECT VendorName, COUNT(*) AS InvoiceQty, SUM(InvoiceTotal) AS InvoiceSum

    FROM Vendors JOIN Invoices ON Vendors.VendorID = Invoices.VendorID

    GROUP BY VendorName

    Câu lệnh CREATE VIEW sử dụng tùy chọn WITH SCHEMABINDINGCREATE VIEW VendorsDue

    WITH SCHEMABINDING

    AS

    SELECT InvoiceDate AS Date, VendorName AS Name,

      VendorContactFName + ' ' + VendorContactLName AS Contact,

      InvoiceNumber AS Invoice,

      InvoiceTotal - PaymentTotal - CreditTotal AS Balance

    FROM dbo.Vendors JOIN dbo.Invoices

      ON Vendors.VendorID = Invoices.VendorID

    WHERE InvoiceTotal - PaymentTotal - CreditTotal > 0

    Ghi chú

    • Nếu đặt tên các cột của một view trong mệnh đề CREATE VIEW, bạn phải đặt têncho toàn bộ cột. Ngược lại, nếu đặt tên các cột trong mệnh đề SELECT, bạn chỉcần đặt tên những cột cần đổi tên không sử dụng tên mặc định.

    Hình 1-4 Các ví dụ CREATE VIEW

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    10/58

    10  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Hướng dẫn tạo view có thể cập nhật

    Khi tạo một view, bạn gọi nó trong câu lệnh SELECT, như đã thấy trong Hình1-1. Ngoài ra, bạn có thể gọi nó trong các câu lệnh INSERT, UPDATE, DELETE để

    chỉnh sửa một bảng cơ sở. Để thực hiện, view phải cập nhật được. Hình 1-5 liệt kêcác yêu cầu để tạo view có thể cập nhật (updatable view).

    Ba yêu cầu đầu tiên nói về những điều phải làm khi viết danh sách lựa chọncủa câu lệnh SELECT định nghĩa view. Như đã thấy, danh sách lựa chọn khôngthể bao gồm mệnh đề DISTINCT hoặc TOP, cũng như không thể bao gồm các hàmtổng hợp(1), và cột được tính toán. Ngoài ra, câu lệnh SELECT không thể bao gồmmệnh đề GROUP BY hoặc HAVING, và hai câu lệnh SELECT không thể được kếtnối với nhau thông qua phép toán hợp.

    Câu lệnh CREATE VIEW đầu tiên trong hình minh họa tạo một view có thể cậpnhật. View này tuân thủ tất cả các yêu cầu cho những view có thể cập nhật. Cónghĩa là, bạn có thể gọi tới nó trong câu lệnh INSERT, UPDATE, hoặc DELETE.Ví dụ, bạn có thể sử dụng câu lệnh UPDATE được chỉ ra ở hình minh họa để cậpnhật cột CreditTotal trong bảng cơ sở Invoices.

    Ngược lại, câu lệnh CREATE VIEW thứ hai trong hình này tạo một view chỉđọc (readonly view). View này chỉ có thể đọc, vì danh sách lựa chọn chứa mộtgiá trị được tính toán.

    Nói chung, sử dụng các câu lệnh INSERT, UPDATE, và DELETE để cập nhậtdữ liệu thông qua một view không linh hoạt và có thể gây ra lỗi. Vì vậy, bạn nêntránh kỹ thuật này khi có thể. Thay vào đó, bạn nên cân nhắc sử dụng trigger

    INSTEAD OF để chỉnh sửa dữ liệu thông qua một view. Bạn sẽ tìm hiểu về loạitrigger này ở Chương 3.

    (1)Hàm tổng hợp (aggregate function): là các hàm thực hiện các phép tính toán trên một tập các giá trị và trả về một giá trị đơn. Ví dụ hàm AVG(tên cột) trả về giá trị trung bình cho một cột có dữ liệu kiểu số.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    11/58

    Chương 1 Hướng dẫn làm việc với view 11

    Các yêu cầu để tạo view có thể cập nhật

    • Danh sách lựa chọn không thể bao gồm mệnh đề DISTINCT hoặc TOP.

    • Danh sách lựa chọn không thể bao gồm một hàm tổng hợp.

    • Danh sách lựa chọn không thể bao gồm một giá trị được tính toán.• Câu lệnh SELECT không thể bao gồm mệnh đề GROUP BY và HAVING.

    • View không thể bao gồm toán tử UNION.

    Câu lệnh CREATE VIEW tạo view có thể cập nhậtCREATE VIEW InvoiceCredit

    AS

    SELECT InvoiceNumber, InvoiceDate, InvoiceTotal, PaymentTotal, CreditTotal

    FROM Invoices

    WHERE InvoiceTotal - PaymentTotal - CreditTotal > 0

    Câu lệnh UPDATE cập nhật viewUPDATE InvoiceCredit

    SET CreditTotal = CreditTotal + 200

    WHERE InvoiceTotal - PaymentTotal - CreditTotal >= 200

    Câu lệnh CREATE VIEW tạo view chỉ đọcCREATE VIEW OutstandingInvoices

    AS

    SELECT InvoiceNumber, InvoiceDate, InvoiceTotal,  InvoiceTotal - PaymentTotal - CreditTotal AS BalanceDue

    FROM Invoices

    WHERE InvoiceTotal - PaymentTotal - CreditTotal > 0

    Tóm lược• View có thể cập nhật   được sử dụng trong câu lệnh INSERT, UPDATE, hoặc

    DELETE để chỉnh sửa các nội dung của một bảng cơ sở của view. Nếu một viewkhông thể cập nhật, nó được gọi là view chỉ đọc .

    • Các yêu cầu khi viết mã view có thể cập nhật chặt chẽ hơn viết mã view chỉ đọc. Đó là do SQL Server phải có khả năng xác định rõ các bảng cơ sở và các cột bịảnh hưởng.

    • Bạn cũng có thể chèn, cập nhật và xóa dữ liệu thông qua một view, sử dụng triggerINSTEAD OF. Xem chi tiết ở Chương 3.

    Hình 1-5 Hướng dẫn tạo view có thể cập nhật

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    12/58

    12  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Hướng dẫn xóa hoặc chỉnh sửa view

    Hình 1-6 biểu diễn các câu lệnh bạn sử dụng để xóa hoặc chỉnh sửa view. Đểxóa view, bạn sử dụng câu lệnh DROP VIEW. Trong câu lệnh này, bạn chỉ cần gọi

    tên view muốn xóa. Tương tự những câu lệnh khác dùng để xóa các đối tượng cơsở dữ liệu, câu lệnh này xóa vĩnh viễn view. Vì vậy, trước tiên, bạn sẽ muốn tạomột bản sao lưu dự phòng của cơ sở dữ liệu để sau này có thể khôi phục view.

     Để chỉnh sửa view, bạn sử dụng câu lệnh ALTER VIEW. Chú ý, cú pháp của câulệnh này giống cú pháp của câu lệnh CREATE VIEW. Nếu hiểu câu lệnh CREATEVIEW, bạn sẽ không gặp phải khó khăn nào khi sử dụng câu lệnh ALTER VIEW.

    Thay vì dùng câu lệnh ALTER VIEW để chỉnh sửa view, bạn có thể xóa rồi tạolại view. Nếu đã định nghĩa các quyền cho view, bạn nên biết rằng những quyềnnày sẽ bị xóa khi view bị xóa. Nếu không muốn điều đó xảy ra hãy sử dụng câulệnh ALTER VIEW.

    Các ví dụ ở hình minh họa cho thấy cách bạn sử dụng các câu lệnh DROPVIEW và ALTER VIEW. Ví dụ đầu tiên là câu lệnh CREATE VIEW tạo một viewcó tên là Vendors_SW. Như bạn thấy, view này truy xuất hàng từ bảng Vendorsđể lấy về thông tin nhà cung cấp ở bốn bang. Sau đó, ví dụ thứ hai là câu lệnh ALTER VIEW chỉnh sửa view để nó bao gồm thêm nhà cung cấp ở hai bang nữa.Cuối cùng, ví dụ thứ ba là câu lệnh DROP VIEW xóa view này.

    Trong chương trước, bạn đã học cách hiển thị các phụ thuộc của một bảng.Trước khi xóa một bảng, bạn nên hiển thị các phụ thuộc của nó để xác định xemcó view nào phụ thuộc vào bảng này hay không. Nếu có, bạn nên xóa các view đi

    kèm với bảng. Nếu không xóa, một truy vấn gọi tới view này sẽ gây lỗi. Để ngănngừa vấn đề này, bạn có thể liên kết view với schema(1) cơ sở dữ liệu, bằng cáchđịnh rõ tùy chọn WITH SCHEMABINDING trong câu lệnh CREATE VIEW hoặc ALTER VIEW. Sau đó, bạn không thể xóa bảng cơ sở khi chưa xóa các view phụthuộc vào bảng này trước.

    (1)Schema (lược đồ cơ sở dữ liệu) : là một đối tượng mức cao trong một DBMS, được tạo ra để chứa các đối tượng của một cơ sở dữ liệu, ví dụ như bảng,khung nhìn…

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    13/58

    Chương 1 Hướng dẫn làm việc với view 13

    Cú pháp của câu lệnh DROP VIEWDROP VIEW ten_view

    Cú pháp của câu lệnh ALTER VIEWALTER VIEW ten_view [(ten_cot_1 [,ten_cot_2]…)]

    [WITH {ENCRYPTION|SCHEMABINDING|ENCRYPTION, SCHEMABINDING}]

    AS

    cau_lenh_select

    [WITH CHECK OPTION]

    Câu lệnh tạo viewCREATE VIEW Vendors_SW

    AS

    SELECT *

    FROM VendorsWHERE VendorState IN ('CA','AZ','NV','NM')

    Câu lệnh chỉnh sửa viewALTER VIEW Vendors_SW

    AS

    SELECT *

    FROM Vendors

    WHERE VendorState IN ('CA','AZ','NV','NM','UT','CO')

    Câu lệnh xóa viewDROP VIEW Vendors_SW

    Tóm lược

    • Để xóa một view khỏi cơ sở dữ liệu, sử dụng câu lệnh DROP VIEW.

    • Để chỉnh sửa định nghĩa của một view, bạn có thể xóa và sau đó tạo lại view, hoặccó thể sử dụng câu lệnh ALTER VIEW để định rõ định nghĩa mới.

    • Khi bạn xóa một view, mọi quyền được gán cho view này cũng bị xóa.

    • Nếu xóa một bảng, bạn nên xóa toàn bộ view phụ thuộc vào bảng đó. Nếu không,có thể xuất hiện lỗi khi bạn chạy câu lệnh truy vấn tham chiếu tới một trong sốcác view đó. Để tìm ra view nào phụ thuộc vào một bảng, hiển thị các phụ thuộcbảng như được mô tả ở chương trước.

    • Nếu định rõ lựa chọn WITH SCHEMABINDING khi tạo hoặc chỉnh sửa một view,bạn sẽ không thể xóa các bảng cơ sở mà không xóa view trước.

    Ghi chú

    • ALTER VIEW không phải là câu lệnh chuẩn ANSI. Cho dù được hỗ trợ trong nhiềuhệ thống trên nền SQL (SQL-based system), hành vi của câu lệnh này trong từnghệ thống là khác nhau.

    Hình 1-6 Hướng dẫn xóa hoặc chỉnh sửa view

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    14/58

    14  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Hướng dẫn sử dụng view

    Bạn đã thấy cách sử dụng view trong các câu lệnh SELECT để truy xuất dữ

    liệu từ một hoặc nhiều bảng cơ sở. Nhưng bạn cũng có thể sử dụng view trongcác câu lệnh INSERT, UPDATE và DELETE để chỉnh sửa dữ liệu trong một bảngcơ sở. Bạn sẽ tìm hiểu cách thực hiện điều này trong mục dưới đây. Ngoài ra, bạnsẽ học cách sử dụng một số view được cung cấp bởi SQL Server, để lấy thông tinvề schema cơ sở dữ liệu.

    Hướng dẫn cập nhật hàng thông qua view

    Hình 1-7 chỉ ra cách bạn có thể cập nhật hàng trong bảng thông qua view. Để

    thực hiện, bạn chỉ cần đặt tên view tham chiếu đến bảng trong câu lệnh UPDATE.Lưu ý, để làm được như vậy view phải có khả năng cập nhật như đã mô tả ở Hình1-5. Ngoài ra, câu lệnh UPDATE chỉ có thể cập nhật dữ liệu trong một bảng cơ sởđơn, ngay cả khi view có hai hoặc nhiều hơn hai bảng cơ sở.

    Các ví dụ trong hình này minh họa cách làm việc trên. Đầu tiên, câu lệnhCREATE VIEW tạo một view có thể cập nhật tên là VendorPayment, kết nối dữliệu từ bảng Vendors và Invoices. Dữ liệu được truy xuất từ view này được chỉ raở hình minh họa. Sau đó, câu lệnh UPDATE sử dụng view này để chỉnh sửa cáccột PaymentDate và PaymentTotal của một nhà cung cấp và hóa đơn cụ thể. Nhưbạn thấy, bảng Invoices phản ánh cập nhật này.

    Chú ý, hàng đã được cập nhật không còn được bao gồm trong view. Đó làdo hàng này không còn đáp ứng tiêu chuẩn trong mệnh đề WHERE của câu lệnhSELECT định nghĩa view. Nếu không muốn như vậy, bạn có thể bao gồm mệnh đềWITH CHECK OPTION trong câu lệnh CREATE VIEW. Khi đó, một cập nhật đượcthực hiện thông qua view sẽ không được cho phép nếu nó khiến hàng bị loại bỏkhỏi view. Ví dụ, nếu mệnh đề WITH CHECK OPTION được bao gồm trong địnhnghĩa view VendorPayment, câu lệnh UPDATE trong hình này dẫn đến kết quả làmột thông điệp lỗi như được chỉ ra trong hình.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    15/58

    Chương 1 Hướng dẫn làm việc với view 15

    Câu lệnh tạo view có thể cập nhậtCREATE VIEW VendorPayment

    AS

    SELECT VendorName, InvoiceNumber, InvoiceDate, PaymentDate,

      InvoiceTotal, CreditTotal, PaymentTotal

    FROM Invoices JOIN Vendors ON Invoices.VendorID = Vendors.VendorIDWHERE InvoiceTotal - PaymentTotal - CreditTotal > 0

    Dữ liệu được truy xuất từ view trước khi cập nhật

    Câu lệnh cập nhật bảng Invoices thông qua viewUPDATE VendorPayment

    SET PaymentTotal = 19351.18, PaymentDate = '2008-08-01'

    WHERE VendorName = 'Malloy Lithographing Inc' AND InvoiceNumber = 'P-0608'

    Bảng Invoices đã cập nhật

    Dữ liệu được truy xuất từ view sau khi cập nhật

    Phản hồi nếu WITH CHECK OPTION được chỉ định cho viewThe attempted insert or update failed because the target view either species WITH

    CHECK OPTION or spans a view that species WITH CHECK OPTION and one or more rows

    resulting from the operation did not qualify under the CHECK OPTION constraint.The statement has been terminated.

    Thao tác chèn hoặc cập nhật thất bại vì view được định nghĩa với tùy chọn WITH CHECK

    OPTION hoặc bao trùm một view được định nghĩa với tùy chọn WITH CHECK OPTION, và một

    hay nhiều hàng từ thao tác không đủ đáp ứng ràng buộc CHECK OPTION. Câu lệnh chấm dứt.

    Tóm lược• Bạn có thể sử dụng câu lệnh UPDATE để cập nhật bảng thông qua view. Để thực

    hiện điều này, bạn đặt tên view trong mệnh đề UPDATE.• View bạn sử dụng trong mệnh đề UPDATE phải có thể cập nhật. Ngoài ra, câu lệnh

    UPDATE không thể cập nhật dữ liệu của nhiều hơn một bảng cơ sở.• Nếu bạn không định rõ WITH CHECK OPTION khi tạo view, thay đổi bạn tạo thông qua

    view có thể dẫn đến các hàng vừa được chỉnh sửa không còn được bao gồm trong view.• Nếu bạn định rõ WITH CHECK OPTION khi tạo view sẽ có lỗi xảy ra trong trường hợp

    bạn cố gắng thay đổi một hàng và sau thao tác đó hàng này sẽ không còn được baogồm trong view nữa.

    Hình 1-7 Hướng dẫn cập nhật hàng thông qua view

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    16/58

    16  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Hướng dẫn chèn hàng thông qua view

     Để chèn hàng thông qua view, bạn sử dụng câu lệnh INSERT như được chỉra ở Hình 1-8. Ở phía trên hình này, bạn thấy, một câu lệnh CREATE VIEW cho

    một view được đặt tên IBM_Invoices. View này truy xuất các cột và hàng từ bảngInvoices cho nhà cung cấp có tên IBM. Sau đó, câu lệnh INSERT cố gắng chènmột hàng vào bảng Invoices thông qua view này.

    Thao tác chèn này thất bại, vì view và câu lệnh INSERT không bao gồm tấtcả các cột được yêu cầu cho bảng Invoices. Trong trường hợp này, một giá trịđược yêu cầu cho các cột InvoiceNumber, InvoiceDate, InvoiceTotal, TermsID,và InvoiceDueDate. Ngược lại, cột InvoiceID có thể được bỏ qua, vì nó là mộtcột định danh; các cột PaymentTotal và CreditTotal cũng có thể được bỏ qua, vìchúng có giá trị mặc định; và cột PaymentDate có thể được bỏ qua, vì nó chấpnhận giá trị null.

    Ngoài việc cung cấp các giá trị cho toàn bộ cột được yêu cầu của một bảng,bạn nên biết câu lệnh INSERT chỉ có thể chèn các hàng vào duy nhất một bảng. Điều đó vẫn đúng ngay cả khi view được tạo thành từ hai hoặc nhiều hơn hai bảngcơ sở, và toàn bộ cột được yêu cầu cho các bảng đó được bao gồm trong view.Trong trường hợp này, bạn sử dụng một câu lệnh INSERT riêng biệt để chèn hàngvào từng bảng thông qua view.

    Hướng dẫn xóa hàng thông qua view

    Hình 1-8 cũng minh họa cách xóa hàng thông qua view. Để thực hiện điều này,bạn có thể sử dụng câu lệnh DELETE như câu lệnh được chỉ ra ở đây. Câu lệnhnày xóa một hóa đơn từ bảng Invoices thông qua view IBM_Invoices. Chú ý, đểlàm việc này, view phải được tạo thành từ một bảng cơ sở. Nếu nó được tạo thànhtừ hai hoặc nhiều bảng cơ sở, thao tác xóa sẽ thất bại.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    17/58

    Chương 1 Hướng dẫn làm việc với view 17

    Câu lệnh tạo view có thể cập nhậtCREATE VIEW IBM_Invoices

    AS

    SELECT InvoiceNumber, InvoiceDate, InvoiceTotal

    FROM Invoices

    WHERE VendorID = (SELECT VendorID FROM Vendors WHERE VendorName = 'IBM')

    Nội dung của view

    Câu lệnh INSERT thất bại do các cột có giá trị nullINSERT INTO IBM_Invoices

      (InvoiceNumber, InvoiceDate, InvoiceTotal)

    VALUES ('RA23988', '2008-07-31', 417.34)

    Phản hồi từ hệ thống

    Cannot insert the value NULL into column 'VendorID', table 'AP.dbo.Invoices';

    column does not allow nulls. INSERT fails. The statement has been terminated.

    Không thể chèn giá trị NULL vào cột 'VendorID', bảng 'AP.dbo.Invoices'; cột

    không cho phép null. Thao tác INSERT thất bại. Câu lệnh chấm dứt.

    Câu lệnh DELETE thành côngDELETE FROM IBM_Invoices

    WHERE InvoiceNumber = 'Q545443'

    Phản hồi từ hệ thống

    (1 row(s) affected)

    Tóm lược

    • Bạn có thể sử dụng câu lệnh INSERT để chèn hàng vào bảng cơ sở thông quaview. Để thực hiện, bạn viết tên view trong mệnh đề INSERT. Cả view và câu lệnhINSERT phải bao gồm tất cả các cột đòi hỏi giá trị từ bảng cơ sở.

    • Nếu view được tạo thành từ nhiều hơn một bảng cơ sở, câu lệnh INSERT có thểchèn dữ liệu vào chỉ một trong số các bảng này.

    • Bạn có thể sử dụng câu lệnh DELETE để xóa hàng từ bảng cơ sở thông qua view. Để thực hiện, bạn gọi tên bảng trong mệnh đề DELETE. Để làm việc này, view phảiđược tạo thành từ duy nhất một bảng cơ sở.

    Hình 1-8 Hướng dẫn chèn hoặc xóa hàng thông qua view

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    18/58

    18  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Hướng dẫn sử dụng catalog view

    Các chuẩn ANSI chỉ định rằng mỗi cơ sở dữ liệu SQL phải duy trì một cataloghệ thống (system catalog) sẵn sàng hoạt động, liệt kê tất cả các đối tượng trong

    một cơ sở dữ liệu. Mặc dù SQL Server cho phép bạn truy vấn trực tiếp catalog hệthống, nhưng bạn không nên làm việc này. Đó là vì, bạn phải viết những truy vấnphụ thuộc vào cấu trúc của các bảng hệ thống tạo nên catalog hệ thống. Do đó,nếu các bảng hệ thống thay đổi trong một phiên bản tương lai của SQL Server, bạnphải thay đổi các truy vấn.

    Thay vì truy vấn trực tiếp tới bảng hệ thống, bạn có thể sử dụng catalog viewđược cung cấp bởi SQL Server. Vì những view này độc lập với cấu trúc của cácbảng hệ thống, bạn không phải lo lắng về việc thay đổi các truy vấn liên quan đếnchúng nếu cấu trúc thay đổi. Hình 1-9 liệt kê một số loại view này và chỉ ra cáchsử dụng chúng.

     Để hiển thị dữ liệu được định nghĩa bởi một catalog view, bạn sử dụng câulệnh SELECT như vẫn thường làm với bất kỳ view nào khác. Ví dụ, câu lệnhSELECT được chỉ ra ở hình minh họa hiển thị tên và schema của mọi bảng trongcơ sở dữ liệu hiện thời. Để thực hiện, câu lệnh kết nối view sys.tables và sys.schemas qua cột schema_id.

    Nếu tham khảo view sys.tables ở Books Online, bạn sẽ thấy bảng này khôngbao gồm tên cột được truy xuất bởi câu lệnh SELECT trong hình minh họa. Thayvào đó, cột này được thừa kế từ view sys.objects. Một view như vậy chứa nhữngcột có thể được kế thừa từ các view khác, được gọi là view cơ sở (base view); và

    view kế thừa các cột được gọi là view dẫn xuất (derived view). Vì các cột của viewcơ sở được tự động thừa kế, bạn có thể coi các cột này như là một phần của viewdẫn xuất.

    Các catalog view đã được giới thiệu cùng SQL Server 2005. Với các phiên bảntrước của SQL Server, bạn đã sử dụng information schema view (view thông tinschema) để truy vấn catalog hệ thống. Mặc dù view này vẫn còn xuất hiện ở cácphiên bản sau của SQL Server, chúng tôi khuyến nghị bạn nên sử dụng catalogview thay thế. Vì không như information schema view, catalog view cung cấp truycập đến tất cả dữ liệu trong catalog hệ thống. Ngoài ra, catalog view hiệu quả hơninformation schema view. Tuy nhiên, nếu sử dụng information schema view, bạn

    nên biết rằng một số view đã thay đổi. Vì vậy, câu lệnh SQL bạn viết trước đây sửdụng information schema view không thể hoạt động được. Để có thêm thông tinvề một information schema view đặc biệt, bạn có thể tra cứu theo tên view này ởBooks Online.

    Tại thời điểm này, bạn sẽ thắc mắc, tại sao cần sử dụng catalog view hayinformation schema view khi mà bạn có thể sử dụng Management Studio để lấycác thông tin tương tự. Câu trả lời là, đôi khi bạn có thể cần lấy thông tin về cácđối tượng trong cơ sở dữ liệu từ các mã kịch bản. Bạn sẽ tìm hiểu cách thực hiệnở chương tới.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    19/58

    Chương 1 Hướng dẫn làm việc với view 19

    Một số catalog view của SQL Server

    Tên view Nội dung

    sys.schema Mỗi hàng ứng với một schema trong cơ sở dữ liệu hiện thời.

    sys.tables Mỗi hàng ứng với một bảng trong cơ sở dữ liệu hiện thời.sys.views Mỗi hàng ứng với một view trong cơ sở dữ liệu hiện thời.

    sys.columns Mỗi hàng ứng với một cột trong mỗi bảng, view, hoặc hàm trả vềdữ liệu bảng (table-valued function) trong cơ sở dữ liệu hiện thời.

    sys.key_constraints Mỗi hàng ứng với một khóa chính hoặc khóa đơn nhất ở mỗibảng trong cơ sở dữ liệu thời.

    sys.foreign_keys Mỗi hàng ứng với một khóa ngoại.

    sys.foreign_key_columns Mỗi hàng ứng với một cột, hoặc tập các cột tạo nên khóa ngoại.

    sys.objects Mỗi hàng ứng với một đối tượng do người dùng tự định nghĩatrong cơ sở dữ liệu hiện thời, trừ trigger.

    Câu lệnh SELECT truy xuất tên và schema của mỗi bảngSELECT sys.tables.name AS TableName, sys.schemas.name AS SchemaName

    FROM sys.tables INNER JOIN sys.schemas

    ON sys.tables.schema_id = sys.schemas.schema_id

    Tập kết quả

    Tóm lược• Bạn có thể sử dụng catalog view  để xem catalog hệ thống , liệt kê toàn bộ đối

    tượng hệ thống định nghĩa một cơ sở dữ liệu, bao gồm các bảng, view, cột, khóavà ràng buộc. Catalog view đã được giới thiệu cùng SQL Server 2005.

    • Một số catalog view kế thừa cột từ catalog view khác. Trong trường hợp này,catalog view mà từ đó các cột được kế thừa được gọi là view cơ sở ; catalog viewkế thừa các cột được gọi là view dẫn xuất .

    • Tra cứu “catalogs views [SQL Server]” trong Books Online để xem danh sách đầy

    đủ của catalog view.

    Ghi chú

    • Bạn cũng có thể sử dụng information schema view  có ở những phiên bản trướccủa SQL Server để kiểm tra catalog hệ thống. Tuy nhiên, chúng tôi khuyến nghịbạn sử dụng catalog view để thay thế.

    Hình 1-9 Hướng dẫn sử dụng catalog view

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    20/58

    20  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Hướng dẫn sử dụng View Designer

    Management Studio cung cấp một công cụ đồ họa được đặt tên là View

    Designer giúp bạn làm việc với view. Tuy nhiên, nhiều lập trình viên thích sử dụngQuery Editor để tự viết mã cho view như đã được mô tả trước đây. Do vậy, mụcnày chỉ cung cấp mô tả sơ lược về View Designer.

    Hướng dẫn tạo hoặc chỉnh sửa view

    Bạn có thể sử dụng View Designer để tạo hoặc chỉnh sửa view, như được môtả ở Hình 1-10. Hình này hiển thị một view được đặt tên VendorPayment trongViewDesigner Công cụ này tương tự với QueryDesigner đã được giới thiệu sơ lược

    ở Chương 2 cuốn "SQL Server 2008 căn bản - Hướng dẫn học qua ví dụ". Để tạo một view mới, nhấn chuột phải vào thư mục Views và chọn lệnh New

    View. Khi thực hiện, View Designer nhắc bạn chọn các bảng cơ sở. Sau đó, cácbảng này sẽ hiển thị trong khung Diagram của View Designer. Khi thích hợp, khungDiagram bao gồm một biểu tượng kết nối chỉ ra những mối quan hệ giữa các bảng.Khi lưu view lần đầu tiên, Management Studio sẽ nhắc nhở bạn điền tên view trênmột hộp thoại.

     Để chỉnh sửa thiết kế của một view có sẵn, bạn có thể mở rộng thư mụcViews, nhấn chuột phải vào view, chọn lệnh Modify để hiển thị view trong ViewDesigner. Nếu cần, bạn có thể sử dụng nút Add Table trong thanh công cụ ViewDesigner để thêm bảng vào khung Diagram.

    Khi hiển thị các bảng của view trong khung Diagram, bạn có thể sử dụngkhung đó để chọn các cột được hiển thị ở khung Criteria. Sau đó, bạn dùng khungCriteria để thiết lập tiêu chuẩn và thứ tự sắp xếp cho truy vấn. Ví dụ khung Criteriatrong hình minh họa chỉ ra các cột sẽ được bao gồm trong view, nó chỉ ra cột cuốicùng là một cột được tính toán không được bao gồm trong tập kết quả, và phảilớn hơn 0.

    Khi bạn làm việc trong khung Diagram và Criteria, View Designer sinh một câulệnh SQL và hiển thị nó trong khung SQL. Khi câu lệnh đã theo ý muốn, bạn có

    thể kiểm tra view bằng cách nhấn vào nút Execute SQL trong thanh công cụ ViewDesigner. Sau đó, dữ liệu trả về bởi view sẽ được hiển thị trong khung Results. Vídụ, trong hình minh họa, khung kết quả hiển thị kết quả chỉ đọc (không chỉnh sửađược), vì view được định nghĩa bởi câu lệnh SQL sử dụng một cột tính toán.

    Hướng dẫn xóa view

    Sử dụng Management Studio để xóa một view cũng tương tự như sử dụngManagement Studio để xóa bất kỳ loại đối tượng cơ sở dữ liệu nào khác. Để bắt

    đầu, nhấn chuột phải vào view và chọn Delete. Sau đó, chọn OK để xác nhận xóa.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    21/58

    Chương 1 Hướng dẫn làm việc với view 21

    Management Studio với một view được hiển thị trong ViewDesigner

    Hướng dẫn tạo hoặc chỉnh sửa thiết kế của view

    • Để tạo view, nhấn chuột phải vào thư mục Views và chọn lệnh New View để hiểnthị một view mới trong View Designer. Sau đó, nhấn Save trên thanh công cụ, bạncó thể cung cấp tên cho view.

    • Để chỉnh sửa thiết kế của một view có sẵn, mở rộng thư mục Views, nhấn chuộtphải vào view và chọn lệnh Design để hiển thị bảng trong View Designer.

    • Để thêm bảng vào khung Diagram, nhấn nút Add Table trong thanh công cụ ViewDesigner.

    • Để chọn các cột cho một view, sử dụng khung Diagram.

    • Để chỉ định các tiêu chuẩn lựa chọn và thứ tự sắp xếp cho view, sử dụng khung

    Criteria.• Để xem đoạn mã được sinh ra cho view, hoặc để chỉnh sửa các đoạn mã được

    sinh, sử dụng khung SQL.

    • Để hiển thị kết quả của view trong khung Results, nhấn nút Execute SQL trongthanh công cụ View Designer.

    Hướng dẫn xóa view

    • Để xóa một view, mở rộng thư mục Views, nhấn chuột phải vào view, chọn lệnh

    Delete để hiển thị hộp thoại Delete Object. Sau đó, nhấn OK để xóa view.

    Hình 1-10 Hướng dẫn sử dụng Management Studio để làm việc với view

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    22/58

    22  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Tổng kết

    Trong chương này, bạn đã học cách tạo và sử dụng view. Như bạn đã thấy,

    view cung cấp một phương pháp cực kỳ hiệu quả và linh hoạt để định nghĩa trướcdữ liệu có thể truy xuất từ một cơ sở dữ liệu. Bằng cách sử dụng view, bạn cóthể giới hạn truy cập tới một cơ sở dữ liệu như cung cấp cho người dùng cuối vàchương trình ứng dụng để truy cập dữ liệu một cách thống nhất và đơn giản.

    Thuật ngữ 

    View ViewBảng khung nhìn Viewed table

    Bảng cơ sở Base tableView lồng Nested viewSchema cơ sở dữ liệu Database schemaView có thể cập nhật Updatable viewView chỉ đọc Read-only viewCác catalog view Catalog viewsView cơ sở Base viewView dẫn xuất Derived viewCatalog hệ thống System catalog

    Information schema view (view thông tin schema) Information schema view

    Bài tập

    1. Viết một câu lệnh CREATE VIEW định nghĩa một view được đặt tên InvoiceBasictrả về ba cột: VendorName, InvoiceNumber, và InvoiceTotal. Sau đó, viếtmột câu lệnh SELECT trả về tất cả các cột trong view, được sắp xếp theoVendorName, trong đó chữ cái đầu tiên của tên nhà cung cấp là N, O, hoặc P.

    2. Tạo một view được đặt tên Top10PaidInvoices trả về ba cột cho mỗi nhà cungcấp: VendorName, LastInvoice (ngày của hóa đơn gần nhất), và SumOfInvoices(tổng của cột InvoiceTotal). Trả về chỉ 10 nhà cung cấp với SumOfInvoices lớnnhất và chỉ bao gồm các hóa đơn đã thanh toán.

    3. Tạo một view có thể cập nhật có tên VendorAddress trả về cột VendorID, baogồm cả cột địa chỉ, thành phố, bang, mã bưu điện cho mỗi nhà cung cấp. Sauđó, viết truy vấn SELECT để kiểm tra tập kết quả với VendorID=4. Tiếp đó, viếtcâu lệnh UPDATE thay đổi địa chỉ sao cho số dãy (Ste 260) được lưu trữ ởVendorAddress2 thay vì VendorAddress1. Để kiểm tra lại thay đổi này, chạy lạitruy vấn SELECT.

    4. Viết một câu lệnh SELECT chọn ra toàn bộ cột từ catalog view trả về thông tinkhóa ngoại cho các bảng. Có bao nhiêu khóa ngoại được định nghĩa trong cơsở dữ liệu AP?

    5. Sử dụng Management Studio, chỉnh sửa view InvoiceBasic được tạo ra trongBài tập 1 để sắp xếp lại tập kết quả theo VendorName. Hệ thống tự động viếtmã mệnh đề nào để cho phép sử dụng một mệnh đề ORDER BY trong view?

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    23/58

    Hướng dẫn viết mã kịch bảnỞ cuối Chương 5 cuốn "SQL Server 2008 căn bản - Hướng dẫn học qua ví dụ", bạnđã thấy một mã kịch bản đơn giản giúp định nghĩa cơ sở dữ liệu AP và các bảng chứatrong đó. Chương này hướng dẫn bạn cách viết những mã kịch bản phức tạp hơn. Vớicác kỹ năng được học trong chương, bạn có thể viết mã kịch bản với những chức năngtương tự chức năng mà các ngôn ngữ lập trình thủ tục, như Visual Basic, C#, Java, vàC++, đã cung cấp.

    Nếu đã có kinh nghiệm với một ngôn ngữ lập trình thủ tục khác, bạn sẽ không gặpbất cứ rắc rối nào với những kỹ năng được trình bày trong chương này. Tuy vậy, bạnnên hiểu rằng sức mạnh lập trình của Transact-SQL giới hạn hơn so với các ngôn ngữkhác. Đó là do Transact-SQL được thiết kế với mục đích đặc biệt để làm việc với cơsở dữ liệu SQL Server thay vì là một ngôn ngữ lập trình với mục đích thông dụng. Vớimục đích sử dụng như vậy, lập trình Transact-SQL trở nên cực kỳ hiệu quả và linh hoạt.

    2

    Giới thiệu mã kịch bản ...........................................................................................24

    Hướng dẫn làm việc với mã kịch bản ......................................................................24

    Các câu lệnh Transact-SQL xử lý mã kịch bản .........................................................26Hướng dẫn làm việc với biến và bảng tạm .........................................................28

    Hướng dẫn làm việc với biến vô hướng ...................................................................28Hướng dẫn làm việc với biến bảng ...........................................................................30Hướng dẫn làm việc với bảng tạm ...........................................................................32So sánh năm loại đối tượng bảng Transact-SQL .....................................................34

    Hướng dẫn điều khiển thực thi mã kịch bản .......................................................36

    Hướng dẫn thực hiện xử lý có điều kiện...................................................................36Hướng dẫn kiểm tra sự tồn tại của đối tượng cơ sở dữ liệu ....................................38Hướng dẫn thực hiện xử lý lặp .................................................................................40Hướng dẫn xử lý lỗi ..................................................................................................42Các kỹ thuật viết mã kịch bản nâng cao ...............................................................44

    Hướng dẫn sử dụng hàm hệ thống ..........................................................................44Hướng dẫn thay đổi thiết lập phiên làm việc ............................................................46Hướng dẫn sử dụng SQL động ................................................................................48Mã kịch bản tổng hợp cấu trúc cơ sở dữ liệu ...........................................................50Hướng dẫn sử dụng tiện ích SQLCMD ....................................................................54

    Tổng kết ...................................................................................................................56

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    24/58

    24  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Giới thiệu mã kịch bản

     Để bắt đầu, chương này ôn lại và mở rộng các khái niệm về mã kịch bản bạn

    đã học trong Chương 5 cuốn "SQL Server 2008 căn bản - Hướng dẫn học qua vídụ". Sau đó, chương sẽ tóm tắt về những câu lệnh SQL bạn có thể sử dụng trongcác mã kịch bản. Hầu hết câu lệnh này sẽ được trình bày chi tiết ở các phần tiếptheo trong chương.

    Hướng dẫn làm việc với mã kịch bản

    Hầu hết mã kịch bản (script) đã học từ đầu cuốn sách đến giờ chỉ bao gồm mộtcâu lệnh SQL duy nhất. Tuy nhiên, mỗi mã kịch bản có thể chứa số lượng câu lệnh

    bất kỳ, và các câu lệnh đó có thể được phân chia thành một hay nhiều nhóm lệnh(batch). Để thông báo kết thúc một nhóm lệnh, bạn viết lệnh GO. Ví dụ, mã kịchbản trong Hình 2-1 gồm hai nhóm. Nhóm đầu tiên tạo một cơ sở dữ liệu và nhómthứ hai tạo ba bảng trong cơ sở dữ liệu đó.

    Vì cơ sở dữ liệu phải tồn tại trước khi bạn thêm bảng cho nó, câu lệnh CREATEDATABASE phải được viết trong một nhóm lệnh riêng biệt, sẽ được thực thi trướccâu lệnh CREATE TABLE. Ngược lại, ba câu lệnh CREATE TABLE không bắt buộcphải nằm trong các nhóm lệnh riêng. Tuy nhiên, chú ý rằng, ba câu lệnh này thuộccùng một nhóm lệnh (nhóm lệnh thứ hai) và được viết theo thứ tự lôgíc. Trongtrường hợp này, bảng CommiteeAssignments tham chiếu tới hai bảng khác, nêncác bảng khác được tạo trước. Nếu tạo CommiteeAssignments trước sẽ không thểkhai báo các ràng buộc khóa ngoại. Trong trường hợp này, các ràng buộc đượcthêm thông qua câu lệnh ALTER TABLE sau khi tạo hai bảng khác.

    Trong hình minh họa liệt kê năm loại câu lệnh bạn sẽ phải đặt nó trong nhữngnhóm lệnh riêng biệt. Trong số này, mỗi câu lệnh phải đứng đầu và là câu lệnh duynhất của nhóm lệnh. Bạn đã học cách viết câu lệnh CREATE VIEW trong chươngtrước, và sẽ tiếp tục tìm hiểu cách viết các câu lệnh CREATE PROCEDURE,CREATE FUNCTION và CREATE TRIGGER ở chương tiếp theo.

    Trước khi tiếp tục, bạn nên nhận ra rằng, GO không phải là câu lệnh

    Transact-SQL. Thay vào đó, GO là một lệnh được thông dịch bởi hai côngcụ phần mềm, bao gồm trong SQL Server: Management Studio và tiện íchSQLCMD. Khi một trong những công cụ này bắt gặp lệnh GO, nó sẽ gửi các câulệnh đứng trước đến server để thực thi. Bạn đã biết cách sử dụng ManagementStudio, và ở các phần tiếp của chương, bạn sẽ tiếp tục tìm hiểu những kiếnthức cơ bản về cách làm việc với tiện ích SQLCMD.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    25/58

    Chương 2 Hướng dẫn viết mã kịch bản 25

    Mã kịch bản với hai nhóm lệnh/*

    Tạo ba bảng trong cơ sở dữ liệu có tên ClubRoster.Tác giả: Bryan SyversonNgày tạo: 2006-08-12Ngày sửa: 2008-09-26*/

    CREATE DATABASE ClubRosterGO

    USE ClubRoster

    CREATE TABLE Members(MemberID int NOT NULL IDENTITY PRIMARY KEY,LastName varchar(75) NOT NULL,

    FirstName varchar(50) NOT NULL,MiddleName varchar(50) NULL)

    CREATE TABLE Committees(CommitteeID int NOT NULL IDENTITY PRIMARY KEY,CommitteeName varchar(50) NOT NULL)

    CREATE TABLE CommitteeAssignments(MemberID int NOT NULL REFERENCES Members(MemberID),CommitteeID int NOT NULL REFERENCES Committees(CommitteeID))

    Các câu lệnh phải nằm trong nhóm lệnh riêngCREATE VIEW CREATE PROCEDURE CREATE FUNCTIONCREATE TRIGGER CREATE SCHEMA

    Tóm lược• Mã kịch bản là một loạt câu lệnh SQL có thể được lưu trữ trong một le. Mỗi mã

    kịch bản có thể chứa một hay nhiều nhóm lệnh (batch). Các câu lệnh trong mỗinhóm lệnh được thực thi như là một đơn vị.

    • Để đánh dấu điểm kết thúc của một nhóm lệnh, bạn sử dụng lệnh GO. Không yêu

    cầu phải có lệnh GO sau nhóm lệnh cuối cùng của một mã kịch bản, hoặc trongmột mã kịch bản chỉ chứa một nhóm lệnh duy nhất.

    • Nếu một câu lệnh phải được thực thi trước thì các câu lệnh theo sau mới thực thithành công, bạn nên chèn một lệnh GO vào sau câu lệnh đó.

    • Các câu lệnh nằm trong một nhóm lệnh được thực thi theo thứ tự xuất hiện. Vì thế,bạn cần viết các câu lệnh phụ thuộc đứng sau các câu lệnh mà chúng phụ thuộc.

    • Nếu tạo một cơ sở dữ liệu bên trong một mã kịch bản, bạn phải thực thi nhóm lệnhchứa câu lệnh CREATE DATABASE trước khi thực thi những câu lệnh khác thamchiếu tới cơ sở dữ liệu trên.

    • Bốn câu lệnh được liệt kê ở trên (CREATE VIEW, CREATE PROCEDURE,CREATE FUNCTION, và CREATE TRIGGER) không thể kết hợp được với cáccâu lệnh khác trong một nhóm lệnh.

    • Bạn nên thêm phần tài liệu chú thích như mô tả ở trên cho các mã kịch bản dùng trongcơ sở dữ liệu thực tế. Những thông tin bổ sung nên được thêm vào khi thích hợp.

    Hình 2-1 Hướng dẫn làm việc với mã kịch bản

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    26/58

    26  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Các câu lệnh Transact-SQL xử lý mã kịch bản

    Hình 2-2 trình bày về câu lệnh Transact-SQL được dùng cho việc xử lý mãkịch bản. Các câu lệnh này là đặc trưng của SQL Server, đôi khi được gọi là câu

    lệnh T-SQL.Trong hình này minh họa một mã kịch bản chứa hai câu lệnh USE và PRINT.

    Trong một mã kịch bản, bạn sử dụng câu lệnh USE để thay đổi cơ sở dữ liệu hiệnthời. Trong ví dụ, câu lệnh USE khiến cơ sở dữ liệu AP trở thành cơ sở dữ liệuhiện thời. Bằng cách đó, bạn không phải lo ngại về việc chọn cơ sở dữ liệu hiệnthời thông qua danh sách xổ xuống trong Management Studio. Và khi tạo cácstored procedure, hàm, trigger như sẽ học ở chương sau, bạn phải sử dụng câulệnh USE.

    Bạn sẽ dùng câu lệnh PRINT để trả về một thông báo cho client. Ví dụ, nếuclient là Management Studio, thông báo sẽ được hiển thị trong tab Messages tạiQuery Editor. Mã kịch bản trong hình minh họa bao gồm hai câu lệnh PRINT. Hãychú ý, câu lệnh đầu tiên sử dụng phép ghép chuỗi để kết hợp một chuỗi ký tự vớigiá trị của một biến. Bạn sẽ được học cách làm việc với các biến cũng như vớinhững câu lệnh khác trong mã kịch bản ngay sau đây.

    Hai câu lệnh sẽ không trình bày trong chương này là GOTO và RETURN. Bạnkhông nên sử dụng câu lệnh GOTO, bởi nó có thể khiến mã kịch bản trở nên rấtkhó theo dõi. Và câu lệnh RETURN được sử dụng thường xuyên nhất với cácstored procedure. Câu lệnh này sẽ được trình bày ở chương sau.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    27/58

    Chương 2 Hướng dẫn viết mã kịch bản 27

    Các câu lệnh Transact-SQL điều khiển luồng thực thi

    Từ khóa Mô tả

    IF…ELSE  Điều khiển luồng thực thi dựa vào điều kiện.

    BEGIN…END  Định nghĩa một khối câu lệnh.WHILE Lặp lại các câu lệnh khi một điều kiện cụ thể là đúng.

    BREAK Thoát khỏi vòng lặp WHILE trong cùng.

    CONTINUE Quay về điểm bắt đầu vòng lặp WHILE.

    TRY…CATCH  Điều khiển luồng thực thi khi có lỗi xảy ra.

    GOTO Thay đổi luồng thực thi vô điều kiện.

    RETURN Thoát vô điều kiện.

    Các câu lệnh Transact-SQL khác dùng cho việc xử lý mã kịch bản

    Từ khóa Mô tả

    USE Thay đổi cơ sở dữ liệu hiện thời thành cơ sở dữ liệu xác định.

    PRINT Trả về một thông báo tới client.

    DECLARE  Định nghĩa biến cục bộ.

    SET Thiết lập giá trị cho biến cục bộ hoặc biến của phiên làm việc.

    EXEC Thực thi câu lệnh SQL hoặc stored procedure động.

    Cú pháp của câu lệnh USEUSE co_so_du_lieu

    Cú pháp của câu lệnh PRINTPRINT bieu_thuc_chuoi

    Mã kịch bản sử dụng một số câu lệnh nêu trênUSE APDECLARE @TotalDue moneySET @TotalDue = (SELECT SUM(InvoiceTotal - PaymentTotal - CreditTotal)  FROM Invoices)IF @TotalDue > 0  PRINT 'Total invoices due = $' + CONVERT(varchar,@TotalDue,1)ELSE

      PRINT 'Invoices paid in full'

    Tóm lược

    • Các câu lệnh này được sử dụng trong mã kịch bản SQL để thêm những chức năngtương tự chức năng được ngôn ngữ lập trình thủ tục cung cấp.

    • Các câu lệnh này là một phần của ngôn ngữ Transact-SQL, hay T-SQL, ngôn ngữkhông có sẵn trong hệ thống nền SQL, trừ SQL Server.

    Hình 2-2 Các câu lệnh Transact-SQL xử lý mã kịch bản

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    28/58

    28  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Hướng dẫn làm việc với biến và bảng tạm

    Trong một mã kịch bản, nếu cần lưu trữ các giá trị, bạn có thể lưu trữ chúng

    trong biến vô hướng (scalar variable), biến bảng (table variable), hoặc bảng tạm(temporary table). Bạn sẽ tìm hiểu cách sử dụng toàn bộ những kỹ thuật này trongcác mục dưới đây. Ngoài ra, bạn sẽ có sự so sánh giữa các loại đối tượng SQLServer khác nhau dùng để làm việc với dữ liệu bảng, từ đó biết cách sử dụng mỗiloại một cách hợp lý.

    Hướng dẫn làm việc với biến vô hướng

    Hình 2-3 trình bày các câu lệnh DECLARE và SET dùng để làm việc với biến.

     Đặc biệt hơn, bạn có thể sử dụng những câu lệnh này để làm việc với biến vôhướng , chỉ chứa một giá trị duy nhất. Bạn dùng câu lệnh DECLARE để tạo mộtbiến và chỉ định loại dữ liệu của biến, đồng thời dùng câu lệnh SET để gán giá trịcho một biến.

    Các biến bạn tạo khi sử dụng câu lệnh DECLARE cũng được gọi là biến cụcbộ (local variable). Đó là do phạm vi của biến chỉ giới hạn trong một nhóm lệnhđơn. Nói cách khác, bạn không thể gọi đến biến đó từ bên ngoài nhóm lệnh. Khácvới biến toàn cục (global variable), vốn là khái niệm cũ cho các hàm hệ thống. Bạnsẽ học về một số hàm hệ thống ở phần sau của chương.

    Bạn cũng có thể gán giá trị cho một biến trong danh sách lựa chọn của câulệnh SELECT. Để thực hiện, bạn sử dụng cú pháp thay thế được đưa ra trong hìnhminh họa. Mặc dù bạn có thể hoàn thành điều tương tự bằng cách sử dụng câulệnh SET để gán kết quả của một câu lệnh SELECT vào một biến, cú pháp thaythế thường tạo ra những mã dễ đọc hơn. Ngoài ra, bạn có thể dùng cú pháp nàyđể gán các giá trị cho một hoặc nhiều biến chỉ bằng một câu lệnh SELECT đơn.

    Mã kịch bản được trình bày trong hình sử dụng năm biến để tính tỷ lệ phầntrăm cho độ chênh lệch giữa hóa đơn nhỏ nhất và lớn nhất của một nhà cung cấpcụ thể. Mã kịch bản bắt đầu bằng việc khai báo tất cả các biến này. Sau đó, hai biếnđược gán giá trị qua các câu lệnh SET. Chú ý, câu lệnh SET thứ hai gán kết quả

    câu lệnh SELECT vào biến, và giá trị của biến thứ nhất được dùng trong mệnh đềWHERE của câu lệnh SELECT này. Câu lệnh SELECT sau hai câu lệnh SET nàysử dụng cú pháp thay thế để gán các giá trị vào hai biến tiếp theo. Sau đó, câu lệnhSET tiếp theo gán kết quả của biểu thức số học vào biến cuối. Sau cùng, câu lệnhPRINT được sử dụng để hiển thị giá trị của bốn trong năm biến.

    Mặc dù có thể dùng biến trong mọi biểu thức, song bạn không thể dùng nó thaythế cho một từ khóa hoặc tên đối tượng. Ví dụ, cú pháp dưới đây không hợp lệ:

    DECLARE @TableNameVar varchar(128)SET @TableNameVar = 'Invoices'SELECT * FROM @TableNameVar

    Tuy nhiên, bạn sẽ học cách thực thi câu lệnh SQL như trên, sử dụng SQL động, ởphần sau của chương.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    29/58

    Chương 2 Hướng dẫn viết mã kịch bản 29

    Cú pháp của câu lệnh DECLARE cho các biến vô hướng  DECLARE @ten_bien_1 kieu_du_lieu [,@ten_bien_2 kieu_du_lieu]…

    Cú pháp của câu lệnh SET cho biến vô hướng  SET @ten_bien = bieu_thuc

    Cú pháp thay thế thiết lập giá trị một biến trong danh sáchlựa chọn

      SELECT @ten_bien = dac_ta_cot

    Mã kịch bản SQL sử dụng các biếnUSE AP

    DECLARE @MaxInvoice money, @MinInvoice moneyDECLARE @PercentDifference decimal(8,2)DECLARE @InvoiceCount int, @VendorIDVar int

    SET @VendorIDVar = 95SET @MaxInvoice = (SELECT MAX(InvoiceTotal) FROM Invoices  WHERE VendorID = @VendorIDVar)SELECT @MinInvoice = MIN(InvoiceTotal), @InvoiceCount = COUNT(*)FROM InvoicesWHERE VendorID = @VendorIDVarSET @PercentDifference = (@MaxInvoice - @MinInvoice) / @MinInvoice * 100

    PRINT 'Maximum invoice is $' + CONVERT(varchar,@MaxInvoice,1) + '.'PRINT 'Minimum invoice is $' + CONVERT(varchar,@MinInvoice,1) + '.'PRINT 'Maximum is ' + CONVERT(varchar,@PercentDifference) +  '% more than minimum.'PRINT 'Number of invoices: ' + CONVERT(varchar,@InvoiceCount) + '.'

    Phản hồi từ hệ thốngMaximum invoice is $46.21.Minimum invoice is $16.33.Maximum is 182.97% more than minimum.

    Number of invoice: 6.

    Tóm lược• Biến  được sử dụng để lưu trữ dữ liệu. Để tạo một biến, bạn dùng câu lệnh

    DECLARE. Giá trị khởi tạo của biến luôn là null.

    • Biến được định nghĩa với kiểu dữ liệu chuẩn chứa một giá trị, và được gọi là biếnvô hướng . Bạn cũng có thể tạo biến bảng để lưu trữ trọn vẹn tập kết quả.

    • Tên biến bắt buộc phải bắt đầu bằng dấu @. Bất cứ khi nào có thể, bạn nên dùngcác tên dài, có tính mô tả để đặt cho biến.

    • Phạm vi của một biến là nhóm lệnh, nơi biến được định nghĩa, tức là không thể thamchiếu đến biến từ bên ngoài nhóm lệnh. Do đó, biến thường được gọi là biến cục bộ.

    • Để gán giá trị cho một biến, bạn có thể dùng câu lệnh SET. Hoặc cách khác, bạncũng có thể sử dụng câu lệnh SELECT để gán giá trị cho một hay nhiền biến.

    • Bạn có thể dùng biến trong mọi biểu thức, nhưng không thể dùng nó thay thế chomột từ khóa hoặc tên đối tượng.

    Hình 2-3 Hướng dẫn làm việc với biến vô hướng

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    30/58

    30  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Hướng dẫn làm việc với biến bảng

    Hình 2-4 trình bày cú pháp của câu lệnh DECLARE dùng để tạo biến bảng.Biến bảng (table variable) là biến có thể lưu trữ các nội dung của trọn vẹn một

    bảng. Để tạo loại biến này, bạn chỉ định kiểu dữ liệu bảng trong câu lệnh DECLAREthay cho các kiểu dữ liệu SQL chuẩn. Sau đó, bạn định nghĩa các cột và ràng buộcsử dụng cú pháp tương tự cú pháp dùng cho câu lệnh CREATE TABLE.

    Mã kịch bản trong hình minh họa cách dùng một biến bảng. Ở đây, câu lệnhDECLARE được dùng để tạo một biến bảng có tên @BigVendors, chứa hai cột:VendorID và VendorName. Sau đó, lệnh INSERT được dùng để chèn toàn bộ hàngdữ liệu từ bảng Vendors, thỏa mãn những nhà cung cấp có tổng hóa đơn lớn hơn5000 USD, vào biến bảng này. Cuối cùng, câu lệnh SELECT được dùng để truyxuất các nội dung của biến bảng.

    Lưu ý, biến bảng trong ví dụ này được dùng thay thế cho tên bảng trong cáccâu lệnh INSERT và SELECT. Bạn cũng có thể dùng biến bảng thay thế cho tênbảng trong câu lệnh UPDATE hoặc DELETE. Nơi duy nhất mà bạn không thể dùngbiến bảng thay cho tên bảng là trong mệnh đề INTO của câu lệnh SELECT INTO.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    31/58

    Chương 2 Hướng dẫn viết mã kịch bản 31

    Cú pháp của câu lệnh DECLARE cho một biến bảngDECLARE @ten_bang TABLE(ten_cot_1 kieu_du_lieu [cac_thuoc_tinh_cot][, ten_cot_2 kieu_du_lieu [cac_thuoc_tinh_cot]]…[, cac_thuoc_tinh_bang])

    Mã kịch bản SQL sử dụng biến bảngUSE AP

    DECLARE @BigVendors table(VendorID int,VendorName varchar(50))

    INSERT @BigVendorsSELECT VendorID, VendorName

    FROM VendorsWHERE VendorID IN (SELECT VendorID FROM Invoices WHERE InvoiceTotal > 5000)

    SELECT * FROM @BigVendors

    Tập kết quả

    Tóm lược

    • Biến bảng  có thể lưu trữ trọn vẹn một tập kết quả thay vì một giá trị đơn. Để tạobiến bảng, sử dụng câu lệnh DECLARE với kiểu dữ liệu bảng.

    • Bạn sử dụng cú pháp tương tự như khi định nghĩa bảng mới bằng câu lệnhCREATE TABLE để định nghĩa các cột của một biến bảng. Xem chi tiết tại Hình5-4 trong Chương 5 cuốn "SQL Server 2008 căn bản - Hướng dẫn học qua ví dụ".

    • Tương tự biến vô hướng, biến bảng có phạm vi cục bộ, nên chỉ có thể sử dụng

    trong nhóm lệnh nó được định nghĩa.• Bạn có thể sử dụng mỗi biến bảng như một bảng chuẩn trong các câu lệnh SELECT,

    INSERT, UPDATE và DELETE. Trường hợp ngoại lệ bạn không thể sử dụng biếnbảng là trong mệnh đề INTO của câu lệnh SELECT INTO.

    Hình 2-4 Hướng dẫn làm việc với biến bảng

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    32/58

    32  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    Hướng dẫn làm việc với bảng tạm

    Bên cạnh biến bảng, bạn có thể dùng bảng tạm (temporary table) để lưu trữdữ liệu bảng bên trong một mã kịch bản. Bảng tạm rất hữu ích trong việc lưu trữ

    dữ liệu bảng trong một mã kịch bản phức tạp. Ngoài ra, chúng cung cấp cho bạncách thức kiểm tra các truy vấn trên dữ liệu tạm thời thay vì trên dữ liệu cố định.

    Không giống biến bảng, bảng tạm tồn tại trong khoảng thời gian của phiênlàm việc mà nó được tạo. Ví dụ, nếu bạn tạo một bảng tạm trong Query Editor củaManagement Studio, nó sẽ tồn tại trong khoảng thời gian Query Editor được mở.Do đó, bạn có thể tham chiếu tới bảng từ một hay nhiều mã kịch bản.

    Hình 2-5 trình bày hai mã kịch bản sử dụng bảng tạm. Mã kịch bản đầu tiêntạo ra một bảng tạm có tên #TopVendors thông qua truy vấn SELECT INTO. Bảngtạm này chứa VendorID và bình quân tổng số tiền hóa đơn của nhà cung cấp trongbảng Vendors có giá trị trung bình lớn nhất. Sau đó, câu lệnh SELECT thứ hai kếtnối bảng tạm với bảng Invoices để lấy ngày tháng của hóa đơn gần nhất của nhàcung cấp đó. Tuy nhiên, chú ý rằng, nếu sử dụng câu lệnh SELECT như ở câulệnh thứ hai trong hình minh họa, với một kế thừa thay cho bảng tạm, bạn có thểtạo kết quả tương tự. Vì bảng dẫn xuất hiệu quả hơn bảng tạm, bạn nên sử dụngchúng bất cứ khi nào có thể.

    Mã kịch bản thứ hai trong hình minh họa cho thấy cách dùng khác của bảngtạm. Mã kịch bản này tạo ra một bảng tạm chứa hai cột: Một identity column (cộtđịnh danh) và một cột ký tự với giá trị mặc định gồm chín chữ số được tạo ra bởihàm RAND. Sau đó, mã kịch bản dùng các giá trị mặc định để chèn hai hàng dữ

    liệu vào bảng tạm. Cuối cùng, mã kịch bản sử dụng câu lệnh SELECT để truy xuấtnội dung bảng. Mã kịch bản như vậy có thể hữu dụng trong quá trình kiểm thử.Trong các ví dụ này, bạn thấy, tên bảng tạm được bắt đầu với dấu thăng (#).

    Nếu tên bắt đầu chỉ với một dấu thăng duy nhất, bảng được định nghĩa là bảngtạm cục bộ (local temporary table), nghĩa là nó chỉ có thể nhìn thấy bởi phiên làmviệc (session) tạo ra nó. Tuy vậy, bạn cũng có thể tạo các bảng tạm có thể nhìnbởi toàn bộ phiên làm việc của cơ sở dữ liệu đang mở, đó là bảng tạm toàn cục(global temporary table). Để tạo một bảng tạm toàn cục, hãy đặt hai dấu thăng ởđầu tên bảng đó.

    Khi một phiên làm việc với cơ sở dữ liệu kết thúc, mọi bảng tạm tạo ra trong

    phiên đều bị xóa. Tuy nhiên, nếu muốn xóa một bảng tạm trước khi phiên kết thúc,bạn có thể thực hiện bằng cách dùng câu lệnh DROP TABLE. Chú ý, mặc dù bảngtạm được lưu trữ trong cơ sở dữ liệu riêng biệt có tên là tempdb, bạn không phảichỉ định tên cơ sở dữ liệu này khi xóa bảng tạm. Đó là vì tên bảng đã chỉ rõ nóchính là bảng tạm, nên SQL Server sẽ hiểu phải tìm nó ở đâu.

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    33/58

    Chương 2 Hướng dẫn viết mã kịch bản 33

    Mã kịch bản sử dụng bảng tạm cục bộ thay vì bảng dẫn xuấtSELECT TOP 1 VendorID, AVG(InvoiceTotal) AS AvgInvoiceINTO #TopVendorsFROM InvoicesGROUP BY VendorIDORDER BY AvgInvoice DESCSELECT Invoices.VendorID, MAX(InvoiceDate) AS LatestInvFROM Invoices JOIN #TopVendors  ON Invoices.VendorID = #TopVendors.VendorIDGROUP BY Invoices.VendorID

    Tập kết quả

    Mã kịch bản tạo bảng tạm toàn cục chứa các số ngẫu nhiênCREATE TABLE ##RandomSSNs(SSN_ID int IDENTITY,SSN char(9) DEFAULT  LEFT(CAST(CAST(CEILING(RAND()*10000000000)AS bigint)AS varchar),9))

    INSERT ##RandomSSNs VALUES (DEFAULT)INSERT ##RandomSSNs VALUES (DEFAULT)

    SELECT * FROM ##RandomSSNs

    Tập kết quả

    Tóm lược• Bảng tạm chỉ tồn tại trong khoảng thời gian của phiên làm việc hiện thời. Trong

    Management Studio, điều này có nghĩa là, bảng tạm chỉ khả dụng cho đến khi bạnđóng cửa sổ nơi tạo ra bảng đó.

    • Bảng tạm được lưu trữ trong cơ sở dữ liệu hệ thống có tên tempdb.

    • Trước khi phiên làm việc hiện thời kết thúc, nếu cần xóa một bảng tạm, bạn có thểsử dụng câu lệnh DROP TABLE.

    • Bảng tạm hữu dụng cho việc kiểm thử các truy vấn, hoặc lưu dữ liệu tạm thời trongmột mã kịch bản phức tạp.

    • Bảng tạm cục bộ chỉ có thể nhìn thấy trong phiên làm việc hiện thời, nhưng bảngtạm toàn cục có thể nhìn thấy bởi tất cả các phiên làm việc. Để xác định một bảng

    tạm cục bộ, bạn thêm vào trước tên của nó một dấu thăng (#). Để xác định mộtbảng tạm toàn cục, bạn thêm vào trước tên của nó hai dấu thăng (##). Các tênbảng tạm được giới hạn lên tới 116 ký tự.

    • Vì bảng dẫn xuất cho hiệu suất cao hơn bảng tạm, bạn nên dùng bảng dẫn xuấtbất cứ khi nào có thể. Xem chi tiết tại Hình 2-6.

    Hình 2-5 Hướng dẫn làm việc với bảng tạm

  • 8/18/2019 SQL Server Nang Cao Trich Dan

    34/58

    34  SQL Server 2008 nâng cao - Hướng dẫn học qua ví dụ

    So sánh năm loại đối tượng bảng Transact-SQL

     Đến đây, khi đã tìm hiểu về biến bảng và bảng tạm, có thể bạn muốn xem xétkhi nào nên sử dụng chúng trong mã kịch bản, khi nào nên tạo bảng chuẩn mới,

    tạo view, hay đơn giản sử dụng một bảng dẫn xuất để thay thế. Hình 2-6 biểu thịkết quả so sánh giữa năm loại đối tượng bảng. Chú ý, dù về mặt kỹ thuật, viewkhông phải là bảng song vẫn bao gồm trong hình minh họa, vì view có thể sử dụngthay cho bảng.

    Một trong những khác biệt lớn nhất giữa các đối tượng nằm ở phạm vi (scope) của chúng, là yếu tố quyết định chúng có thể được dùng ở đâu trong một mã kịchbản. Vì bảng chuẩn và view được lưu trữ vĩnh viễn trong một cơ sở dữ liệu, chúngcó phạm vi rộng nhất và có thể được dùng ở bất cứ đâu, bao gồm mã kịch bảnkhác trên kết nối hiện thời, hoặc trong mã kịch bản khác trên những kết nối khác.Ngược lại, bảng dẫn xuất chỉ tồn tại trong thời gian thực thi của truy vấn tạo ra nó.Bởi vậy, bảng dẫn xuất không thể được tham chiếu từ bên ngoài truy vấn. Như bạnđã học, bảng tạm và biến bảng đều nằm ở khoảng giữa các phạm vi này.

    Một sự khác biệt nữa giữa năm loại bảng là vị trí lưu trữ chúng. Tương tựbảng chuẩn, bảng tạm được lưu trữ trong ổ đĩa. Ngược lại, biến bảng và bảng dẫnxuất được lưu trữ trong bộ nhớ, nếu chúng tương đối nhỏ. Vì thế, biến bảng vàbảng dẫn xuất thường tốn ít thời gian để tạo cũng như truy cập hơn bảng chuẩnvà bảng tạm.

    Mặc dù view cũng được lưu trữ trong ổ đĩa, nó có thể được sử dụng nhanhchóng hơn bất kỳ đối tượng bảng nào khác. Đó là do view chỉ là một truy vấn đã

    biên dịch sẵn, nên mất ít thời gian để tạo và truy cập hơn so với bảng thực. Tuyvậy, bạn có thể chèn, cập nhật, hay xóa dữ liệu với những đối tượng bảng khác màkhông ảnh hưởng đến các bảng gốc trong cơ sở dữ liệu; nhưng với một view, điềuđó không còn