Cập nhật tháng 1 năm 2017 - SQL Server 2016+ / Cơ sở dữ liệu SQL Azure
SQL Server 2016 và phiên bản hiện tại của Azure SQL Database hiện có cú pháp sau cho các chức năng, quy trình, bảng, cơ sở dữ liệu, v.v. ( DROP IF EXISTS
):
DROP FUNCTION IF EXISTS dbo.fn_myfunc;
Và SQL Server 2016 Gói dịch vụ 1 bổ sung thêm chức năng tốt hơn cho các mô-đun (chức năng, quy trình, trình kích hoạt, chế độ xem) có nghĩa là không mất quyền hoặc phụ thuộc ( CREATE OR ALTER
):
CREATE OR ALTER FUNCTION dbo.fn_myfunc ...
Cả hai cải tiến cú pháp này có thể dẫn đến các tập lệnh đơn giản hơn nhiều được sử dụng để kiểm soát nguồn, triển khai, v.v.
Nhưng, nếu bạn đang sử dụng ...
Các phiên bản cũ hơn
Bạn cần làm những gì SQL Server làm khi bạn viết kịch bản này từ Management Studio:
IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE type = 'FN' AND name = 'fn_myfunc')
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'CREATE FUNCTION ...';
EXEC sp_executesql @sql;
END
Hoặc bạn có thể nói:
BEGIN TRY
DROP FUNCTION dbo.fn_myfunc;
END TRY
BEGIN CATCH
PRINT 'Function did not exist.';
END CATCH
GO
CREATE FUNCTION...
Hoặc bạn chỉ có thể nói:
DROP FUNCTION dbo.fn_myfunc;
GO
CREATE FUNCTION...
(Ở đây bạn sẽ nhận được thông báo lỗi nếu hàm không tồn tại, nhưng tập lệnh sẽ tiếp tục từ GO tiếp theo, do đó, liệu thả có hoạt động hay không, hàm vẫn sẽ được tạo lại.)
Lưu ý rằng nếu bạn bỏ chức năng và tạo lại chức năng đó, bạn cũng sẽ mất quyền và thông tin phụ thuộc tiềm năng.