Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server 2016:Tạo một thủ tục được lưu trữ

Thủ tục được lưu trữ là một nhóm các câu lệnh SQL được biên dịch thành một. Các thủ tục được lưu trữ có thể bao gồm logic nghiệp vụ và các cấu trúc lập trình khác.

Trong SQL Server, thủ tục được lưu trữ là một nhóm gồm một hoặc nhiều câu lệnh Transact-SQL hoặc tham chiếu đến phương thức ngôn ngữ thời gian chạy thông dụng (CLR) của Microsoft .NET Framework.

Khả năng lập trình

Nhưng một thủ tục được lưu trữ không chỉ là một tập lệnh dài. Đó là một tập lệnh đã được lưu trong SQL Server cụ thể theo Thủ tục được lưu trữ và nó có thể:

  • Chấp nhận các tham số đầu vào (và trả về nhiều giá trị ở dạng tham số đầu ra cho chương trình đang gọi).
  • Chứa các câu lệnh lập trình.
  • Trả lại một giá trị trạng thái cho một chương trình gọi điện để cho biết sự thành công hay thất bại và lý do của bất kỳ sự thất bại nào.

Các thủ tục được lưu trữ thường chứa logic nghiệp vụ. Ví dụ:một thủ tục được lưu trữ có thể chấp nhận các tham số được truyền cho nó và kiểm tra các tham số đó bằng cách sử dụng IF các câu lệnh. Ví dụ:nếu tham số là một giá trị, hãy thực hiện điều này, nếu đó là một giá trị khác, hãy thực hiện điều đó.

Các thủ tục được lưu trữ có thể cải thiện hiệu suất trong một ứng dụng, bởi vì thủ tục đã lưu trữ được phân tích cú pháp và tối ưu hóa ngay khi nó được tạo, sau đó được lưu trữ trong bộ nhớ. Chạy một truy vấn có điều kiện thông qua thủ tục được lưu trữ có thể cực kỳ nhanh chóng - so với một ứng dụng gửi một truy vấn qua mạng, tới SQL Server, sau đó có tất cả dữ liệu được trả lại cho nó trên toàn mạng để nó có thể lọc qua và chọn ra chỉ những bản ghi mà nó quan tâm.

Lợi ích của các thủ tục được lưu trữ

Dưới đây là một số lợi ích chính khi sử dụng các thủ tục được lưu trữ:

Lợi ích Giải thích
Lập trình mô-đun Bạn có thể viết một quy trình đã lưu trữ một lần, sau đó gọi lại quy trình đó từ các phần khác nhau của ứng dụng (và thậm chí từ nhiều ứng dụng).
Hiệu suất Các thủ tục được lưu trữ cung cấp khả năng thực thi mã nhanh hơn và giảm lưu lượng mạng.
  • Thực thi nhanh hơn:Các thủ tục đã lưu trữ được phân tích cú pháp và tối ưu hóa ngay sau khi chúng được tạo và thủ tục đã lưu trữ được lưu trong bộ nhớ. Điều này có nghĩa là nó sẽ thực thi nhanh hơn rất nhiều so với việc gửi nhiều dòng mã SQL từ ứng dụng của bạn đến SQL Server. Làm điều đó yêu cầu SQL Server biên dịch và tối ưu hóa mã SQL của bạn mỗi khi nó chạy.
  • Lưu lượng mạng giảm:Nếu bạn gửi nhiều dòng mã SQL qua mạng tới Máy chủ SQL của mình, điều này sẽ ảnh hưởng đến hiệu suất mạng. Điều này đặc biệt đúng nếu bạn có hàng trăm dòng mã SQL và / hoặc bạn có nhiều hoạt động trên ứng dụng của mình. Chạy mã trên SQL Server (như một thủ tục được lưu trữ) loại bỏ sự cần thiết phải gửi mã này qua mạng. Lưu lượng mạng duy nhất sẽ là các tham số được cung cấp và kết quả của bất kỳ truy vấn nào.
Bảo mật Người dùng có thể thực thi một thủ tục được lưu trữ mà không cần thực hiện trực tiếp bất kỳ câu lệnh nào. Do đó, một quy trình được lưu trữ có thể cung cấp chức năng cơ sở dữ liệu nâng cao cho những người dùng thường không có quyền truy cập vào các tác vụ này, nhưng chức năng này được cung cấp theo cách được kiểm soát chặt chẽ.

Cách tạo một thủ tục được lưu trữ

Để tạo một thủ tục được lưu trữ, hãy sử dụng CREATE PROCEDURE , theo sau là mã tạo nên thủ tục được lưu trữ. Nếu thủ tục được lưu trữ của bạn sẽ chấp nhận các tham số, chúng cần được bao gồm sau tên.

CREATE PROCEDURE myStoredProcedure AS
...

OR

CREATE PROCEDURE myStoredProcedure @ParameterName DataType AS
...

Bây giờ chúng ta sẽ tạo một thủ tục được lưu trữ dựa trên một trong những dạng xem mà chúng ta đã tạo trước đó - RecentAlbums xem.

Chế độ xem này trả về tất cả các album đã phát hành trong 20 năm qua. Điều này là tốt miễn là nó sẽ không bao giờ cần phải nhìn lại sau 20 năm. Nhưng nếu bạn muốn người dùng chọn thời hạn sử dụng là bao nhiêu năm?

Một thủ tục được lưu trữ có thể giải quyết vấn đề này.

Chúng tôi sẽ tạo một thủ tục được lưu trữ chấp nhận một tham số. Giá trị của tham số sẽ là số năm cần tìm kiếm lại. Do đó, giá trị này có thể được chỉ định bởi người dùng bất cứ khi nào họ thực hiện thủ tục được lưu trữ.

  1. Thiết kế quy trình đã lưu trữ

    Mở cửa sổ truy vấn mới và thêm mã cho quy trình đã lưu trữ.

    Trong trường hợp của chúng tôi, chúng tôi sẽ sao chép / dán mã từ RecentArtists xem và sửa đổi phần trên cùng để nó trở thành một thủ tục được lưu trữ.

    Chúng tôi sẽ thêm một tham số có tên là @Count điều đó sẽ xác định bao nhiêu năm quy trình được lưu trữ sẽ nhìn lại.

    Vì vậy, chúng tôi sẽ thay thế giá trị mã hóa cứng của 20 với @Count

    Mã mẫu

    Đây là mã từ ví dụ của chúng tôi:

    CREATE PROCEDURE spRecentAlbums @Count int
    AS
    SELECT  Albums.ReleaseDate, 
            Albums.AlbumName, 
            Genres.Genre, 
            Artists.ArtistName,
            Artists.ActiveFrom
    FROM Albums 
    INNER JOIN
            Artists ON 
            Albums.ArtistId = Artists.ArtistId 
            INNER JOIN
                Genres ON 
                Albums.GenreId = Genres.GenreId
    WHERE   (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE()));
  2. Tạo thủ tục được lưu trữ

    Khi tất cả đều ổn, bạn có thể thực thi câu lệnh để tạo thủ tục được lưu trữ.

    Nhấp vào Execute để tạo thủ tục được lưu trữ.

    Khi thủ tục được lưu trữ đã được tạo, bạn có thể thấy nó trong Trình khám phá đối tượng (bạn có thể cần phải làm mới Thủ tục được lưu trữ nút đầu tiên).

  3. Thực hiện quy trình đã lưu trữ

    Bây giờ nó đã được tạo, bạn có thể thực hiện thủ tục được lưu trữ.

    Mở một cửa sổ truy vấn mới, thêm cái này:

    EXEC spRecentAlbums @Count = 5;

    Bây giờ hãy nhấp vào Execute từ thanh công cụ.

    Quy trình đã lưu trữ sẽ trả lại tất cả các album đã phát hành trong 5 năm qua.

  4. Thử các Tham số khác

    Hãy thử thay đổi giá trị của tham số để xem điều này ảnh hưởng như thế nào đến kết quả.

    Bạn cũng có thể chạy nhiều câu lệnh lần lượt. Một ngăn kết quả mới sẽ xuất hiện cho mỗi câu lệnh.

Mẫu thủ tục được lưu trữ

Trong SQL Server 2016, bạn có thể tạo một thủ tục được lưu trữ bằng cách nhấp chuột phải vào Thủ tục được lưu trữ trong Trình khám phá đối tượng và chọn Mới> Thủ tục đã lưu trữ ... hoặc Mới> Quy trình được lưu trữ được biên dịch theo nguyên tắc ... .

Thao tác này sẽ mở ra một mẫu đã sẵn sàng để được điền với quy trình cụ thể của riêng bạn.

Thực thi một thủ tục đã lưu trữ thông qua GUI

Bạn cũng có thể sử dụng giao diện người dùng đồ họa để thực hiện một thủ tục được lưu trữ.

  1. Khởi chạy Quy trình thực thi Hộp thoại

    Trong Trình khám phá đối tượng, nhấp chuột phải vào thủ tục đã lưu trữ và chọn Thực thi thủ tục đã lưu trữ ... .

  2. Tham số cung cấp

    Nhập giá trị cho bất kỳ tham số nào mà thủ tục được lưu trữ yêu cầu, sau đó nhấp vào OK .

  3. Kết quả

    Kết quả được hiển thị.

Sửa đổi thủ tục đã lưu trữ

Nếu bạn cần sửa đổi quy trình được lưu trữ hiện có, chỉ cần thay thế CREATE với ALTER (cùng với quy trình cập nhật).

Ví dụ này sửa đổi quy trình được lưu trữ để các kết quả được sắp xếp theo ngày phát hành theo thứ tự giảm dần:

ALTER PROCEDURE spRecentAlbums @Count int
AS
SELECT  Albums.ReleaseDate, 
        Albums.AlbumName, 
        Genres.Genre, 
        Artists.ArtistName,
        Artists.ActiveFrom
FROM Albums 
INNER JOIN
        Artists ON 
        Albums.ArtistId = Artists.ArtistId 
        INNER JOIN
            Genres ON 
            Albums.GenreId = Genres.GenreId
WHERE   (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE()))
ORDER BY Albums.ReleaseDate DESC;

Thủ tục lưu trữ hệ thống

SQL Server bao gồm một số lượng lớn các thủ tục được lưu trữ trong hệ thống để hỗ trợ các tác vụ quản trị cơ sở dữ liệu. Nhiều tác vụ bạn có thể thực hiện thông qua GUI có thể được thực hiện thông qua một quy trình được lưu trữ trong hệ thống. Ví dụ:một số điều bạn có thể làm với các thủ tục được lưu trữ trong hệ thống bao gồm:

  • Định cấu hình tài khoản bảo mật
  • Thiết lập các máy chủ được liên kết
  • Tạo một kế hoạch bảo trì cơ sở dữ liệu
  • Tạo danh mục tìm kiếm văn bản đầy đủ
  • Thêm đăng nhập từ xa
  • Định cấu hình sao chép
  • Thiết lập các công việc đã lên lịch
  • và nhiều hơn nữa ...

Các thủ tục được lưu trữ trong hệ thống có tiền tố là sp_ , vì vậy tốt nhất bạn nên tránh sử dụng tiền tố đó cho các thủ tục của riêng bạn.

Quy ước đặt tên

Bạn nên phát triển một quy ước đặt tên nhất quán cho các thủ tục được lưu trữ của bạn (và cho tất cả các đối tượng khác trong cơ sở dữ liệu của bạn).

Một số người đặt tiền tố các thủ tục được lưu trữ của họ bằng usp_ (để chỉ ra một thủ tục được lưu trữ do người dùng xác định), những người khác bắt đầu nó bằng một từ khóa SQL, chẳng hạn như select , chèn , cập nhật , xóa . Những người khác sử dụng chữ viết tắt của ứng dụng.

Một số sử dụng dấu gạch dưới để phân tách từng từ trong quy trình được lưu trữ (ví dụ: near_albums ), trong khi những người khác sẽ sử dụng chữ hoa tiêu đề (ví dụ: RecentAlbums ).

Do đó, có thể thủ tục được lưu trữ của chúng tôi có thể được đặt tên theo bất kỳ tên nào sau đây, tùy thuộc vào quy ước đặt tên đang được sử dụng.

  • Album gần đây
  • gần đây_albums
  • uspRecentAlbums
  • usp_recent_albums
  • selectRecentAlbums
  • select_RecentAlbums
  • select_recent_albums
  • getRecentAlbums
  • get_recent_albums

Bạn nhận được hình ảnh. Điều quan trọng là tính nhất quán. Chọn một cái và gắn bó với nó. Nó sẽ làm cho nó dễ dàng hơn khi bạn cần sử dụng một thủ tục được lưu trữ. Hãy tưởng tượng có điểm, hoặc thậm chí hàng trăm thủ tục được lưu trữ và mỗi khi bạn thực hiện một thủ tục, bạn cần điều hướng đến nó trong Object Explorer hoàn toàn vì bạn không thể nhớ mình đã gọi nó là usp_RecentAlbums hay chưa hoặc uspRecentAlbums .

Như đã đề cập, tránh sử dụng sp_ làm tiền tố cho tên thủ tục được lưu trữ của bạn. SQL Server sử dụng tiền tố này cho các thủ tục được hệ thống lưu trữ.

SQL Server tìm kiếm các thủ tục được lưu trữ trong hệ thống trước tiên, vì vậy, tốt nhất là bạn sẽ phải thực hiện. Tệ nhất, thủ tục của bạn sẽ không chạy (nếu nó có chung tên với một thủ tục được lưu trữ trong hệ thống).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MSSQL Biểu thức chính quy

  2. Kết nối SAP IQ với SQL Server

  3. Cách gửi một email HTML từ SQL Server (T-SQL)

  4. Một kết nối đã được thiết lập thành công với máy chủ, nhưng sau đó đã xảy ra lỗi trong quá trình bắt tay đăng nhập trước

  5. Tìm phụ thuộc trong SQL Server:sql_expression_dependencies