检查表是否存在动态

问题描述 投票:0回答:2
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
    EXEC(@TAB)
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)

我收到错误,为什么?

Msg 2809,Level 16,State 1,Line 1 过程'Employees'的请求失败,因为'Employees'是一个表对象。

sql-server database tsql information-schema
2个回答
2
投票

你只犯了一个错误,而不是使用EXEC(@TAB)你应该使用EXEC(@DROP)

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)

1
投票

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

...
'DROP TABLE IF EXISTS ' + @TAB + ';' + 
'CREATE TABLE ' + @TAB + 
...

字面上每个对象都可以DIE,你可以得到更多细节here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.