Trong bài viết này, tôi sẽ cung cấp một cấu trúc để xóa một đối tượng trước khi tạo nó.
Trong nhóm của chúng tôi, có khoảng 20 nhà phát triển SQL Ninja. Tất cả chúng đều mô tả cấu trúc này theo những cách khác nhau.
Nhóm của chúng tôi bao gồm khoảng 20 nhân viên hỗ trợ SQL và tất cả họ đều sử dụng câu lệnh sau theo một cách khác:
IF OBJECT_ID('dbo.Function', 'TF') IS NOT NULL
DROP FUNCTION dbo.Function;
GO
CREATE FUNCTION dbo.Function .. Hoặc:
IF EXISTS (
SELECT *
FROM sys.objects
WHERE name = 'Procedure'
AND type = 'P'
)
DROP PROCEDURE dbo.Procedure;
GO
CREATE PROCEDURE dbo.Procedure .. Hoặc:
IF EXISTS (
SELECT 1
FROM sys.objects
WHERE object_id = OBJECT_ID(N'dbo.Function')
AND type IN (N'FN', N'IF', N'TF', N'FS', N'FT')
)
DROP FUNCTION dbo.Function;
GO
CREATE FUNCTION dbo.Function .. Trên StackOverflow, người dùng thích phiên bản này:
IF EXISTS (
SELECT * FROM sysobjects WHERE id = object_id(N'function_name')
AND xtype IN (N'FN', N'IF', N'TF')
)
DROP FUNCTION function_name
GO Các ngôi sao được căn chỉnh và tôi tìm thấy một triển khai thích hợp trong một trong các trang web SQL. Lúc đầu, tôi bị sốc, nhưng sau đó mọi người đã giúp tìm hiểu lý do tại sao nó hoạt động tốt.
IF OBJECT_ID('dbo.Function', 'TF') IS NULL
EXEC('CREATE FUNCTION dbo.Function() RETURNS @t TABLE(i INT) BEGIN RETURN END');
GO
ALTER FUNCTION dbo.Function .. Vấn đề là nếu bạn sử dụng câu lệnh DROP và CREATE mỗi lần, thì bạn sẽ xóa quyền đối tượng. Ngoài ra, đối tượng có thể nằm trong bản sao và nó cũng sẽ bị xóa sau khi được tạo lại.
Vì vậy, tôi thích phiên bản này và quyết định đưa nó vào dbo.antidrop thủ tục.
Thủ tục chỉ nhận hai đối số:tên đối tượng và kiểu của nó. Để kiểm tra loại đối tượng, hãy thực hiện câu lệnh sau:
SELECT type FROM sys.objects WHERE name = 'Name'
Đây là cách nó sẽ trông như thế nào:
EXEC dbo.antidrop('dbo.Name', 'FN');
GO
ALTER FUNCTION dbo.Name .. Cuối cùng, mã của thủ tục như sau:
IF OBJECT_ID('dbo.antidrop', 'P') IS NULL
EXEC('CREATE PROC dbo.antidrop AS');
GO
CREATE PROC dbo.antidrop @name SYSNAME, @type SYSNAME
AS
BEGIN
DECLARE @if_tf NVARCHAR(512) = '
IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
EXEC(''CREATE FUNCTION ' + @name + '() RETURNS @t TABLE(i INT) BEGIN RETURN END'');
GO
';
DECLARE @fn NVARCHAR(512) = '
IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
EXEC(''CREATE FUNCTION ' + @name + '(@i INT) RETURNS INT AS BEGIN RETURN @i + 1 END'');
GO
';
DECLARE @p NVARCHAR(512) = '
IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
EXEC(''CREATE PROC ' + @name + 'AS'');
GO
';
DECLARE @v NVARCHAR(512) = '
IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
EXEC(''CREATE VIEW ' + @name + ' AS SELECT 1 AS i'');
GO
';
IF @type in (N'IF', N'TF')
BEGIN
EXEC(@if_tf);
END
ELSE IF @type = N'FN'
BEGIN
EXEC(@fn);
END
ELSE IF @type = N'P'
BEGIN
EXEC(@p);
END
ELSE IF @type = N'V'
BEGIN
EXEC(@v);
END
END
GO Cảm ơn bạn đã chú ý theo dõi!