Tôi đã học Hàm và Thủ tục lưu trữ trong một thời gian dài nhưng tôi không biết tại sao và khi nào tôi nên sử dụng một hàm hoặc một thủ tục được lưu trữ. Họ trông giống tôi, có lẽ vì tôi là người mới về điều đó.
Ai đó có thể cho tôi biết tại sao?
Tôi đã học Hàm và Thủ tục lưu trữ trong một thời gian dài nhưng tôi không biết tại sao và khi nào tôi nên sử dụng một hàm hoặc một thủ tục được lưu trữ. Họ trông giống tôi, có lẽ vì tôi là người mới về điều đó.
Ai đó có thể cho tôi biết tại sao?
Câu trả lời:
Các hàm là các giá trị được tính toán và không thể thực hiện các thay đổi môi trường vĩnh viễn thành SQL Server
(nghĩa là không INSERT
hoặc các UPDATE
câu lệnh được phép).
Một hàm có thể được sử dụng nội tuyến trong các SQL
câu lệnh nếu nó trả về giá trị vô hướng hoặc có thể được nối nếu nó trả về một tập kết quả.
Một điểm đáng chú ý từ các ý kiến, trong đó tóm tắt câu trả lời. Cảm ơn @Sean K Anderson:
Các hàm tuân theo định nghĩa khoa học máy tính ở chỗ chúng PHẢI trả về một giá trị và không thể thay đổi dữ liệu chúng nhận được dưới dạng tham số (các đối số). Các hàm không được phép thay đổi bất cứ điều gì, phải có ít nhất một tham số và chúng phải trả về một giá trị. Các procs được lưu trữ không phải có một tham số, có thể thay đổi các đối tượng cơ sở dữ liệu và không phải trả về một giá trị.
Cách gọi SQL
hàm từ thủ tục lưu trữ và khi chúng ta sử dụng hàm thay vì thủ tục được lưu trữ.
Xin chào các bạn, hôm nay chúng ta sẽ thảo luận Khi nào nên sử dụng thủ tục được lưu trữ và khi nào nên sử dụng chức năng. Trong nhóm đơn giản Nếu bạn muốn tính toán một số giá trị và nó sẽ trả về một giá trị duy nhất, do đó không bắt buộc:
https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html
Sự khác biệt giữa SP và UDF được liệt kê dưới đây:
+---------------------------------+----------------------------------------+
| Stored Procedure (SP) | Function (UDF - User Defined |
| | Function) |
+---------------------------------+----------------------------------------+
| SP can return zero , single or | Function must return a single value |
| multiple values. | (which may be a scalar or a table). |
+---------------------------------+----------------------------------------+
| We can use transaction in SP. | We can't use transaction in UDF. |
+---------------------------------+----------------------------------------+
| SP can have input/output | Only input parameter. |
| parameter. | |
+---------------------------------+----------------------------------------+
| We can call function from SP. | We can't call SP from function. |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/ | We can use UDF in SELECT/ WHERE/ |
| WHERE/ HAVING statement. | HAVING statement. |
+---------------------------------+----------------------------------------+
| We can use exception handling | We can't use Try-Catch block in UDF. |
| using Try-Catch block in SP. | |
+---------------------------------+----------------------------------------+
Chức năng và thủ tục lưu trữ phục vụ các mục đích riêng biệt. Mặc dù nó không phải là sự tương tự tốt nhất, các hàm có thể được xem theo nghĩa đen như bất kỳ chức năng nào khác mà bạn sử dụng trong bất kỳ ngôn ngữ lập trình nào, nhưng các procs được lưu trữ giống như các chương trình riêng lẻ hoặc một tập lệnh bó.
Các chức năng thường có một đầu ra và đầu vào tùy chọn. Đầu ra sau đó có thể được sử dụng làm đầu vào cho một chức năng khác (Máy chủ SQL tích hợp sẵn như DATEDIFF, LEN, v.v.) hoặc làm vị ngữ cho Truy vấn SQL - ví dụ: SELECT a, b, dbo.MyFunction(c) FROM table
hoặc SELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)
.
Các procs được lưu trữ được sử dụng để liên kết các truy vấn SQL với nhau trong một giao dịch và giao diện với thế giới bên ngoài. Các khung như ADO.NET, v.v. không thể gọi hàm trực tiếp, nhưng chúng có thể gọi trực tiếp một Proc được lưu trữ.
Các chức năng có một mối nguy hiểm tiềm ẩn: chúng có thể bị sử dụng sai và gây ra các vấn đề hiệu suất khá khó chịu: xem xét truy vấn này:
SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)
Trường hợp MyFactor được khai báo là:
CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
DECLARE @retval INTEGER
SELECT localValue
FROM dbo.localToNationalMapTable
WHERE nationalValue = @someValue
RETURN @retval
END
Điều xảy ra ở đây là hàm MyFunction được gọi cho mỗi hàng trong bảng MyTable. Nếu MyTable có 1000 hàng, thì đó là 1000 truy vấn đặc biệt khác đối với cơ sở dữ liệu. Tương tự, nếu hàm được gọi khi được chỉ định trong thông số cột, thì hàm sẽ được gọi cho mỗi hàng được trả về bởi SELECT.
Vì vậy, bạn cần phải cẩn thận chức năng viết. Nếu bạn thực hiện CHỌN từ một bảng trong một hàm, bạn cần tự hỏi liệu nó có thể được thực hiện tốt hơn với THAM GIA trong phần lưu trữ cha mẹ hoặc một số cấu trúc SQL khác (như CASE ... KHI ... ELSE ... KẾT THÚC).
SELECT * from dbo.MyTableValuedFunction()
. Sprocs, mặt khác, có thể được gọi trực tiếp với ADO.NET bằng cách đặt SqlCommand.CommandType
thành CommandType.StoredProcedure
.
Sự khác nhau giữa các thủ tục được lưu trữ và các chức năng do người dùng xác định:
RAISEERROR
HOẶC @@ERROR
không được phép trong UDFs.GETDATE()
không thể được sử dụng trong UDFs.GETDATE()
có thể được sử dụng trong Hàm. Trục trên Không xác định không phải là một tốt.
Viết hàm do người dùng định nghĩa khi bạn muốn tính toán và trả về giá trị để sử dụng trong các câu lệnh SQL khác; viết một thủ tục được lưu trữ khi bạn muốn thay vào đó là nhóm một tập hợp các câu lệnh SQL có thể phức tạp. Đây là hai trường hợp sử dụng khá khác nhau, sau khi tất cả!
STORE PROCEDURE FUNCTION (USER DEFINED FUNCTION)
* Procedure can return 0, single or | * Function can return only single value
multiple values. |
|
* Procedure can have input, output | * Function can have only input
parameters. | parameters.
|
* Procedure cannot be called from | * Functions can be called from
function. | procedure.
|
* Procedure allows select as well as | * Function allows only select statement
DML statement in it. | in it.
|
* Exception can be handled by | * Try-catch block cannot be used in a
try-catch block in a procedure. | function.
|
* We can go for transaction management| * We can't go for transaction
in procedure. | management in function.
|
* Procedure cannot be utilized in a | * Function can be embedded in a select
select statement | statement.
|
* Procedure can affect the state | * Function can not affect the state
of database means it can perform | of database means it can not
CRUD operation on database. | perform CRUD operation on
| database.
|
* Procedure can use temporary tables. | * Function can not use
| temporary tables.
|
* Procedure can alter the server | * Function can not alter the
environment parameters. | environment parameters.
|
* Procedure can use when we want | * Function can use when we want
instead is to group a possibly- | to compute and return a value
complex set of SQL statements. | for use in other SQL
| statements.
Sự khác biệt cơ bản
Hàm phải trả về một giá trị nhưng trong Thủ tục lưu trữ thì nó là tùy chọn (Quy trình có thể trả về giá trị 0 hoặc n).
Các hàm chỉ có thể có các tham số đầu vào cho nó trong khi Thủ tục có thể có các tham số đầu vào / đầu ra.
Hàm lấy một tham số đầu vào là bắt buộc nhưng Thủ tục lưu trữ có thể mất o đến n tham số đầu vào ..
Hàm có thể được gọi từ Thủ tục trong khi Thủ tục không thể được gọi từ Hàm.
Sự khác biệt trước
Quy trình cho phép câu lệnh CHỌN cũng như DML (INSERT / UPDATE / DELETE) trong đó trong khi Hàm chỉ cho phép câu lệnh CHỌN trong đó.
Các thủ tục không thể được sử dụng trong câu lệnh SELECT trong khi Hàm có thể được nhúng trong câu lệnh SELECT.
Các thủ tục được lưu trữ không thể được sử dụng trong các câu lệnh SQL ở bất cứ đâu trong phần WHERE / HAVING / SELECT trong khi Hàm có thể.
Các hàm trả về bảng có thể được coi là một hàng khác. Điều này có thể được sử dụng trong THAM GIA với các bảng khác.
Hàm Inline có thể mặc dù là các khung nhìn lấy tham số và có thể được sử dụng trong THAM GIA và các hoạt động Rowset khác.
Ngoại lệ có thể được xử lý bằng khối bắt thử trong Quy trình trong khi khối bắt thử có thể được sử dụng trong Hàm.
Chúng tôi có thể đi Quản lý giao dịch trong Thủ tục trong khi chúng tôi không thể vào Chức năng.
Returns
từ khóa và phải là loại vô hướng hoặc bảng) , nhưng Các thủ tục được lưu trữ có thể tùy ý trả về: a) 1 Int
loại Mã kết quả thông qua Return
Tuyên bố và / hoặc b) 1+ Tham số (loại bao gồm Cursor
) thông qua Output
từ khóa và / hoặc c) 1+ Bộ hàng thông qua Select
Báo cáo. Nếu chỉ có 1 Hàng được trả về, nó có thể được sử dụng làm đối số "exec_statement" của câu lệnh "Chèn vào".
Hàm do người dùng xác định là một công cụ quan trọng có sẵn cho lập trình viên máy chủ sql. Bạn có thể sử dụng nó nội tuyến trong một câu lệnh SQL như vậy
SELECT a, lookupValue(b), c FROM customers
nơi lookupValue
sẽ là một UDF. Loại chức năng này là không thể khi sử dụng một thủ tục được lưu trữ. Đồng thời bạn không thể thực hiện một số điều nhất định trong UDF. Điều cơ bản cần nhớ ở đây là UDF:
một thủ tục lưu trữ có thể làm những điều đó.
Đối với tôi, việc sử dụng nội tuyến của UDF là việc sử dụng UDF quan trọng nhất.
Thủ tục lưu trữ được sử dụng như các kịch bản . Họ chạy một loạt các lệnh cho bạn và bạn có thể lên lịch để chạy vào những thời điểm nhất định. Thường chạy nhiều câu lệnh DML như INSERT, UPDATE, DELETE, v.v. hoặc thậm chí CHỌN.
Các hàm được sử dụng làm phương thức. Bạn vượt qua nó một cái gì đó và nó trả về một kết quả. Nên nhỏ và nhanh - làm điều đó một cách nhanh chóng. Thường được sử dụng trong một câu lệnh CHỌN.
Thủ tục lưu trữ:
EXEC
hoặc EXECUTE
tuyên bố.OUT
tham số.Chức năng:
Chỉ có thể được sử dụng để chọn hồ sơ. Tuy nhiên, nó có thể được gọi rất dễ dàng từ bên trong SQL tiêu chuẩn, chẳng hạn như:
SELECT dbo.functionname('Parameter1')
hoặc là
SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
Đối với các thao tác chọn tái sử dụng đơn giản, các chức năng có thể đơn giản hóa mã. Chỉ cần cảnh giác với việc sử dụng JOIN
mệnh đề trong các chức năng của bạn. Nếu hàm của bạn có một JOIN
mệnh đề và bạn gọi nó từ một câu lệnh chọn khác trả về nhiều kết quả, lệnh gọi hàm đó sẽ JOIN
kết hợp các bảng đó cho mỗi dòng được trả về trong tập kết quả. Vì vậy, mặc dù chúng có thể hữu ích trong việc đơn giản hóa một số logic, chúng cũng có thể là một nút cổ chai hiệu năng nếu chúng không được sử dụng đúng cách.
OUT
tham số.Hàm do người dùng xác định.
Thủ tục lưu trữ
Để quyết định khi nào nên sử dụng những điểm nào sau đây có thể giúp-
Các thủ tục được lưu trữ không thể trả về một biến bảng trong đó hàm có thể làm điều đó.
Bạn có thể sử dụng các thủ tục được lưu trữ để thay đổi các tham số môi trường máy chủ trong khi sử dụng các chức năng bạn không thể.
chúc mừng
Các chức năng của SQL Server, như con trỏ, được dùng làm vũ khí cuối cùng của bạn! Họ có vấn đề về hiệu năng và do đó sử dụng hàm có giá trị bảng nên tránh càng nhiều càng tốt. Nói về hiệu suất là nói về một bảng có hơn 1.000.000 bản ghi được lưu trữ trên một máy chủ trên phần cứng hạng trung; nếu không, bạn không cần phải lo lắng về hiệu năng gây ra bởi các chức năng.
để tham khảo thêm, hãy xem: http://database.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-dposed-f ghép.html
Bắt đầu với các hàm trả về một giá trị duy nhất. Điều tuyệt vời là bạn có thể đặt mã được sử dụng thường xuyên vào một hàm và trả về chúng dưới dạng một cột trong tập kết quả.
Sau đó, bạn có thể sử dụng một chức năng cho một danh sách các thành phố được tham số hóa. dbo.GetCitiesIn ("NY") Trả về một bảng có thể được sử dụng như một phép nối.
Đó là một cách tổ chức mã. Biết khi nào một cái gì đó có thể tái sử dụng và khi nó là một sự lãng phí thời gian là một cái gì đó chỉ có được thông qua thử nghiệm và lỗi và kinh nghiệm.
Ngoài ra, các chức năng là một ý tưởng tốt trong SQL Server. Chúng nhanh hơn và có thể khá mạnh mẽ. Nội tuyến và lựa chọn trực tiếp. Cẩn thận không lạm dụng.
Đây là một lý do thực tế để thích các chức năng hơn các thủ tục được lưu trữ. Nếu bạn có một thủ tục được lưu trữ cần kết quả của một thủ tục được lưu trữ khác, bạn phải sử dụng câu lệnh insert-exec. Điều này có nghĩa là bạn phải tạo một bảng tạm thời và sử dụng một exec
câu lệnh để chèn kết quả của thủ tục được lưu trữ vào bảng tạm thời. Nó lộn xộn. Một vấn đề với điều này là insert-execs không thể được lồng nhau .
Nếu bạn bị mắc kẹt với các thủ tục được lưu trữ gọi các thủ tục được lưu trữ khác, bạn có thể gặp phải điều này. Nếu thủ tục lưu trữ lồng nhau chỉ đơn giản trả về một tập dữ liệu, nó có thể được thay thế bằng hàm có giá trị bảng và bạn sẽ không còn gặp phải lỗi này nữa.
( đây là một lý do khác chúng ta nên giữ logic kinh doanh ra khỏi cơ sở dữ liệu )
Các hàm có thể được sử dụng trong một câu lệnh chọn trong khi các thủ tục không thể.
Thủ tục lưu trữ có cả tham số đầu vào và đầu ra nhưng Hàm chỉ lấy tham số đầu vào.
Các hàm không thể trả về các giá trị của văn bản loại, ntext, hình ảnh và dấu thời gian khi có thể làm thủ tục.
Các hàm có thể được sử dụng như các kiểu dữ liệu do người dùng định nghĩa trong bảng tạo nhưng các thủ tục không thể.
*** Ví dụ: -tạo table <tablename>(name varchar(10),salary getsal(name))
Ở đây gotal là một hàm do người dùng xác định trả về loại lương, khi bảng được tạo, không có lưu trữ nào được phân bổ cho loại lương và hàm getal cũng không được thực thi, nhưng khi chúng ta tìm nạp một số giá trị từ bảng này, hàm getal sẽ được thực thi và Kiểu trả về được trả về như tập kết quả.
Tôi nhận ra đây là một câu hỏi rất cũ, nhưng tôi không thấy một khía cạnh quan trọng nào được đề cập trong bất kỳ câu trả lời nào: đưa vào kế hoạch truy vấn.
Chức năng có thể ...
Vô hướng:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
Bảng đa giá trị:
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
Bảng nội tuyến có giá trị:
CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...
Loại thứ ba (giá trị bảng nội tuyến) được xử lý bởi trình tối ưu hóa truy vấn về cơ bản dưới dạng các khung nhìn (tham số hóa), có nghĩa là tham chiếu hàm từ truy vấn của bạn tương tự như dán cơ thể SQL của chức năng (không thực sự dán sao chép), dẫn đầu với những lợi ích sau:
Những điều trên có thể dẫn đến khả năng tiết kiệm hiệu suất đáng kể, đặc biệt là khi kết hợp nhiều cấp độ chức năng.
LƯU Ý: Có vẻ như SQL Server 2019 cũng sẽ giới thiệu một số dạng hàm vô hướng .
Trong SQL Server, các hàm và thủ tục được lưu trữ là hai loại thực thể khác nhau.
Hàm: Trong cơ sở dữ liệu SQL Server, các hàm được sử dụng để thực hiện một số hành động và hành động trả về kết quả ngay lập tức. Chức năng có hai loại:
Hệ thống xác định
Đã xác định người dùng
Các thủ tục được lưu trữ: Trong SQL Server, các thủ tục được lưu trữ được lưu trữ trong máy chủ và nó có thể được trả về 0, một và nhiều giá trị. Thủ tục lưu trữ có hai loại: