T-SQL在SQL Server中判断表、字段、索引、视图、触发器、Synonym等是否存在

SQL Server创建或者删除表、字段、索引、视图、触发器前判断是否存在。

目录

[1. SQL Server创建表之前判断表是否存在](#1. SQL Server创建表之前判断表是否存在)

[2. SQL Server新增字段之前判断是否存在](#2. SQL Server新增字段之前判断是否存在)

[3. SQL Server删除字段之前判断是否存在](#3. SQL Server删除字段之前判断是否存在)

[4. SQL Server新增索引之前判断是否存在](#4. SQL Server新增索引之前判断是否存在)

[5. SQL Server判断视图是否存在并创建](#5. SQL Server判断视图是否存在并创建)

[6. SQL Server判断触发器是否存在并创建](#6. SQL Server判断触发器是否存在并创建)

[7. 创建SYNONYM 之前判断是否存在](#7. 创建SYNONYM 之前判断是否存在)


1. SQL Server创建表之前判断表是否存在

sql 复制代码
IF OBJECT_ID('[dbo].[Documents]', 'U') IS  NULL  
begin
    -- This table used to save recent 2 years documents
    CREATE TABLE [dbo].[Documents] (
        [Id]                        INT             NOT NULL,
        [DocumentGroupId]           INT             NOT NULL,
        [FileName]                  VARCHAR (200)   NULL,
        [FilePath]                  VARCHAR (250)   NULL,
        [CreateDate]                DATETIME        NOT NULL,
        [ModifyDate]                DATETIME        NOT NULL,
        [DocumentStatus]            VARCHAR (2)     NULL
    )


END
GO

2. SQL Server新增字段之前判断是否存在

sql 复制代码
--[dbo].[AgencyDocuments] table name
--EffectiveDateTest column name. 此处不可以用[EffectiveDateTest]
if COL_LENGTH('[dbo].[AgencyDocuments]','EffectiveDateTest') is null
begin
	alter table [dbo].[AgencyDocuments] add [EffectiveDateTest] DATETIME NULL
end
go

3. SQL Server删除字段之前判断是否存在

sql 复制代码
--[dbo].[AgencyDocuments] table name
--EffectiveDateTest column name. 此处不可以用[EffectiveDateTest]
if COL_LENGTH('[dbo].[AgencyDocuments]','EffectiveDateTest') is NOT null
begin
	alter table [dbo].[AgencyDocuments] drop column [EffectiveDateTest] 
end
go

4. SQL Server新增索引之前判断是否存在

sql 复制代码
IF NOT EXISTS (SELECT top 1 1 FROM sys.indexes  WHERE name='IX_AgencyDocument_Id' AND object_id = OBJECT_ID('[dbo].[AgencyDocuments]'))
BEGIN    
    CREATE NONCLUSTERED INDEX IX_AgencyDocument_Id ON [dbo].[AgencyDocuments] ([Id])
	    INCLUDE ([DocumentGroupId],[FileName],[FilePath],[CreateDate],[DocumentStatus])
END
GO

5. SQL Server判断视图是否存在并创建

sql 复制代码
-- View存在则删除
IF OBJECT_ID('vw_AgencyDocuments') IS NOT NULL
begin
	drop view  vw_AgencyDocuments
end
GO
--创建View
create view vw_AgencyDocuments as 
select Id from [dbo].[AgencyDocuments]
go

6. SQL Server判断触发器是否存在并创建

sql 复制代码
-- 判断是否存在,存在则删除
IF OBJECT_ID ('[dbo].[TRIGGER_INSERT_AGENCYDOCUMENTS]', 'TR') IS NOT NULL 
begin
	drop trigger [dbo].[TRIGGER_INSERT_AGENCYDOCUMENTS]  
end
GO

-- 创新新的触发器
CREATE TRIGGER [dbo].[TRIGGER_UPDATE_AGENCYDOCUMENTS] ON [dbo].[Document] AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE m
        SET [ModifyDate] = n.[ModifyDate]  
        ,[Status] = n.[Status]      
        ,[DocumentStatus] = n.[DocumentStatus] 
    FROM [dbo].[AgencyDocuments] m JOIN INSERTED n on m.Id=n.Id 

    SET NOCOUNT OFF;
END

GO

7. 创建SYNONYM 之前判断是否存在

sql 复制代码
if not exists (select * from sys.synonyms where object_id=OBJECT_ID('[dbo].[AgencyDocuments]'))
begin
    CREATE SYNONYM [dbo].[AgencyDocuments] FOR [ABC_REPL].[dbo].[AgencyDocuments]
end
go
相关推荐
Kt&Rs37 分钟前
MySQL复制技术的发展历程
数据库·mysql
小小菜鸡ing40 分钟前
pymysql
java·服务器·数据库
手握风云-1 小时前
MySQL数据库精研之旅第十六期:深度拆解事务核心(上)
数据库·mysql
boonya2 小时前
Redis核心原理与面试问题解析
数据库·redis·面试
沙二原住民2 小时前
提升数据库性能的秘密武器:深入解析慢查询、连接池与Druid监控
java·数据库·oracle
三毛20042 小时前
玳瑁的嵌入式日记D33-0908(SQL数据库)
jvm·数据库·sql
叫我龙翔2 小时前
【MySQL】从零开始了解数据库开发 --- 库的操作
数据库·mysql·数据库开发
没有bug.的程序员2 小时前
Redis Stream:轻量级消息队列深度解析
java·数据库·chrome·redis·消息队列
GottdesKrieges3 小时前
OceanBase容量统计:租户、数据库、表大小
数据库·oceanbase
pan3035074793 小时前
mysql 回表查询(二次查询,如何检查,如何规避)
数据库·mysql