我有一个表,每个月1日动态创建。比如11月的test201711。
我想检查DB Drop test201711中是否存在test201711
到目前为止我尝试了什么:
Declare @ste varchar(max)
set @ste = 'if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME =''test'+CONVERT(varchar(6),getdate(),112) + ''');' + ' Drop table test'+ CONVERT(varchar(6),getdate(),112)
print @ste
exec(@ste)
当我打印查询时它是正确的,但是当我执行它时会给我一个错误。
我的代码在这里出了什么问题?
答案 0 :(得分:2)
简单地使用这样的。它对我有用。
-- Create the table for testing
CREATE TABLE Test201711
(
id INT
)
SELECT NAME
FROM sys.tables AS t
WHERE t.name = 'Test201711'
DECLARE @TableName VARCHAR(100) = 'Test' + CONVERT(VARCHAR(6), GETDATE(), 112)
IF OBJECT_ID(@TableName) IS NOT NULL
EXEC ('DROP Table ' + @TableName)
SELECT NAME
FROM sys.tables AS t
WHERE t.name = 'Test201711'
答案 1 :(得分:0)
我猜这个问题是分号。
Declare @ste nvarchar(max);
set @ste = '
if exists (select *
from INFORMATION_SCHEMA.TABLES
where TABLE_NAME = ''[tablename]''
)
Drop table [tablename]
';
set @ste = replace(@ste, '[tablename]', CONVERT(varchar(6), getdate(), 112));
print @ste
exec sp_executesql @ste;
注意:
replace()
将其放入查询字符串中。if
末尾的分号已删除。sp_executesql
。它比exec()
强大得多,即使参数在这种情况下没用。您也可以使用try
/ catch
块执行此操作:
begin try
drop table [tablename]
end try
begin catch
-- assume table doesn't exist and ignore error
end catch;