Tôi biết điều này phải đơn giản, nhưng làm thế nào để tôi bắt đầu việc tạo một hàm với một dấu kiểm để xem nó đã tồn tại chưa? Nếu nó tồn tại, tôi muốn xóa và tạo lại nó.
Tôi biết điều này phải đơn giản, nhưng làm thế nào để tôi bắt đầu việc tạo một hàm với một dấu kiểm để xem nó đã tồn tại chưa? Nếu nó tồn tại, tôi muốn xóa và tạo lại nó.
Câu trả lời:
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
Nếu bạn muốn tránh các bảng sys *, thay vào đó bạn có thể làm (từ đây trong ví dụ A):
IF object_id(N'function_name', N'FN') IS NOT NULL
DROP FUNCTION function_name
GO
Điều chính cần nắm bắt là loại hàm bạn đang cố gắng xóa (được biểu thị trong sql hàng đầu bằng FN, IF và TF):
if object_id('FUNCTION_NAME') is not NULL
DROP FUNCTION <name>
Bạn cũng có thể tra cứu tên trong sysobjects
IF EXISTS (SELECT *
FROM sysobjects
WHERE name='<function name>' and xtype='FN'
Trên thực tế, nếu hàm có thể là một hàm bảng, bạn cần sử dụng
xtype in ('FN','TF')
Bạn có hai tùy chọn để bỏ và tạo lại quy trình trong SQL Server 2016.
Bắt đầu từ SQL Server 2016 - sử dụng IF EXISTS
DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ] [;]
Bắt đầu từ SQL Server 2016 SP1 - sử dụng OR ALTER
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
IF EXISTS
(SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'functionName')
AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION functionName
GO
Tôi thường né tránh các truy vấn từ các bảng kiểu sys *, các nhà cung cấp có xu hướng thay đổi những điều này giữa các bản phát hành, chính hoặc khác. Những gì tôi luôn làm là phát hành DROP FUNCTION <name>
câu lệnh và không lo lắng về bất kỳ lỗi SQL nào có thể quay trở lại. Tôi coi đó là thủ tục tiêu chuẩn trong lĩnh vực DBA.
IF EXISTS
(SELECT *
FROM schema.sys.objects
WHERE name = 'func_name')
DROP FUNCTION [dbo].[func_name]
GO
Đây là công việc của tôi:
if(object_id(N'[dbo].[fn_Nth_Pos]', N'FN')) is not null
drop function [dbo].[fn_Nth_Pos];
GO
CREATE FUNCTION [dbo].[fn_Nth_Pos]
(
@find char, --char to find
@search varchar(max), --string to process
@nth int --occurrence
)
RETURNS int
AS
BEGIN
declare @pos int --position of nth occurrence
--init
set @pos = 0
while(@nth > 0)
begin
set @pos = charindex(@find,@search,@pos+1)
set @nth = @nth - 1
end
return @pos
END
GO
--EXAMPLE
declare @files table(name varchar(max));
insert into @files(name) values('abc_1_2_3_4.gif');
insert into @files(name) values('zzz_12_3_3_45.gif');
select
f.name,
dbo.fn_Nth_Pos('_', f.name, 1) as [1st],
dbo.fn_Nth_Pos('_', f.name, 2) as [2nd],
dbo.fn_Nth_Pos('_', f.name, 3) as [3rd],
dbo.fn_Nth_Pos('_', f.name, 4) as [4th]
from
@files f;
Kiểm tra IF tồn tại cho chức năng
IF EXISTS (SELECT TOP 1 1 FROM sys.objects WHERE
object_id = OBJECT_ID(N'[Schema].[function_Name]')
AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
BEGIN
DROP FUNCTION [Schema].[function_Name]
Print('function dropped => [Schema].[function_Name]')
END
GO
Kiểm tra NẾU Tồn tại cho quy trình Đã lưu trữ, Chức năng cũng bằng cách nhấp vào liên kết bên dưới http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger- Chức năng- and.html
Nếu bạn muốn sử dụng tiêu chuẩn SQL ISO INFORMATION_SCHEMA và không dành riêng cho SQL Server sysobjects
, bạn có thể thực hiện việc này:
IF EXISTS (
SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
DROP FUNCTION [dbo].[FunctionName]
GO