有没有一种方法可以检查对象是SQL Server中的表还是视图?

时间:2019-05-30 16:06:04

标签: sql-server

我认为我要更改为SQL Server中的表。

我先删除视图,然后在代码的下一部分中建立表。

我的代码在我第一次运行它时有效(当对象是视图时),但是当我需要多次运行它时,出现此错误:

  

不能将DROP VIEW与'engineer.Well'一起使用,因为'engineer.Well'是一个表。使用DROP TABLE。

我一直在网上寻找,但是找不到一种方法来检查对象是表还是视图,并随后删除该对象。

任何建议将不胜感激。

现在看起来像这样,

IF OBJECT_ID('engineer.well') IS NOT NULL
BEGIN
    DROP TABLE [engineer].[Well]
    PRINT '<<< DROPPED TABLE Vendor >>>'
END

我正在研究一种方法,以检查对象是否为表格然后将其删除,或者检查它是否为视图然后将其删除。

3 个答案:

答案 0 :(得分:5)

您可以查询系统视图。

DECLARE @Type varchar(2)
SELECT @Type = type 
FROM sys.objects o
JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE o.name = 'well'
AND s.name = 'engineer'

IF  @Type = 'U'
BEGIN
    DROP TABLE [engineer].[Well]
    PRINT '<<< DROPPED TABLE Vendor >>>'
END

IF  @Type = 'V'
BEGIN
    DROP VIEW [engineer].[Well]
    PRINT '<<< DROPPED VIEW Vendor >>>'
END

答案 1 :(得分:1)

OBJECTPROPERTY(OBJECT_ID('name'),'IsView') https://docs.microsoft.com/en-us/sql/t-sql/functions/objectproperty-transact-sql?view=sql-server-2017 要么 选择ID,然后输入FROM sysobjects,其中id = OBJECT_ID('objectName')

答案 2 :(得分:0)

您可以查询sys.objects表:

select type_desc, * from sys.objects where object_id = object_id('[dbo].[DimDates]')