Sql server 动态检查表是否存在的步骤

Sql server 动态检查表是否存在的步骤,sql-server,database,tsql,information-schema,Sql Server,Database,Tsql,Information Schema,我出错了,为什么 Msg 2809,第16级,状态1,第1行 请求过程“Employees”失败,因为“Employees”是表对象 您只犯了一个错误,没有使用EXEC(@TAB)。您应该使用EXEC(@DROP) 您只犯了一个错误,没有使用EXEC(@TAB)。您应该使用EXEC(@DROP) 从SQL Server 2016 SP1开始,对象可以DIE-DropIfExists。因此,对于您的情况,您可以跳过存在性检查,并在动态SQL中仅构建以下T-SQL语句: DECLARE @DROP

我出错了,为什么

Msg 2809,第16级,状态1,第1行
请求过程“Employees”失败,因为“Employees”是表对象


您只犯了一个错误,没有使用EXEC(@TAB)。您应该使用EXEC(@DROP)


您只犯了一个错误,没有使用EXEC(@TAB)。您应该使用EXEC(@DROP)


从SQL Server 2016 SP1开始,对象可以
DIE
-
D
rop
I
f
E
xists。因此,对于您的情况,您可以跳过存在性检查,并在动态SQL中仅构建以下T-SQL语句:

DECLARE @DROP VARCHAR(MAX)
DECLARE @TAB VARCHAR(MAX)='Employees'
DECLARE @CREATE VARCHAR(MAX)
DECLARE @SELECT VARCHAR(MAX)
--IF OBJECT_ID('DBO.'+@TAB,'U') IS NOT NULL
--BEGIN
IF 
(EXISTS 
    (
    SELECT 
        1 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_SCHEMA = 'dbo' 
    AND  TABLE_NAME = @TAB
    )
)
BEGIN
    SET @DROP=N'DROP TABLE '+@TAB
    print @DROP
    EXEC(@DROP)
END
SET @CREATE=
    'CREATE TABLE '+@TAB+
    '(
        ID INT
        ,NAME VARCHAR(50)
        ,PHONE VARCHAR(25)
        ,ADDRESS VARCHAR(100)
    )'
EXEC(@CREATE)
SET @SELECT='SELECT * FROM '+@TAB
EXEC(@SELECT)
从字面上看,每个对象都可能死亡,您可以获得更多详细信息:


从SQL Server 2016 SP1开始,对象可以
死亡
-
D
rop
I
f
E
xists。因此,对于您的情况,您可以跳过存在性检查,并在动态SQL中仅构建以下T-SQL语句:

DECLARE @DROP VARCHAR(MAX)
DECLARE @TAB VARCHAR(MAX)='Employees'
DECLARE @CREATE VARCHAR(MAX)
DECLARE @SELECT VARCHAR(MAX)
--IF OBJECT_ID('DBO.'+@TAB,'U') IS NOT NULL
--BEGIN
IF 
(EXISTS 
    (
    SELECT 
        1 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_SCHEMA = 'dbo' 
    AND  TABLE_NAME = @TAB
    )
)
BEGIN
    SET @DROP=N'DROP TABLE '+@TAB
    print @DROP
    EXEC(@DROP)
END
SET @CREATE=
    'CREATE TABLE '+@TAB+
    '(
        ID INT
        ,NAME VARCHAR(50)
        ,PHONE VARCHAR(25)
        ,ADDRESS VARCHAR(100)
    )'
EXEC(@CREATE)
SET @SELECT='SELECT * FROM '+@TAB
EXEC(@SELECT)
从字面上看,每个对象都可能死亡,您可以获得更多详细信息:


这是因为您执行的表或对象不是位于
EXEC(@TAB)
的sql脚本将其更改为
EXEC(@DROP)
迟到的感谢@yogeshharmathats,因为您执行的表或对象不是位于
EXEC(@TAB)
将其更改为
EXEC(@DROP)
迟到的感谢@yogeshharma
...
'DROP TABLE IF EXISTS ' + @TAB + ';' + 
'CREATE TABLE ' + @TAB + 
...