在 sys.tables 中声明一个基于名称的变量,然后在动态 SQL 中删除基于该变量的 table
Declare a variable based on name in sys.tables then delete the table based on that variable in dynamic SQL
所以我希望第一段代码找到 table 名称,然后如果 table 名称存在并且超过 3 天,则删除 table。
我对这段代码的问题是代码没有用实际的 table DrinkSales 替换 @temp_name
。所以在 select 语句中没有正确设置变量。
当前代码:
declare @table varchar(100) = 'DrinkSales'
DECLARE @temp_name VARCHAR(100)
declare @drop varchar(max) = '
DECLARE @temp_name VARCHAR(100)
select @temp_name= name
FROM sys.objects
WHERE DATEDIFF(day, create_date, getdate()) > 3
and name = '''+@table+'''
select @temp_name
--if object_id(''dbo.'+@table+''', ''U'') is not null -- needs to be changed to detect if variable is null rather than table.
--drop table dbo.'+@table+'
'
print(@drop)
exec(@drop)
所以结果应该是:
DECLARE @temp_name VARCHAR(100)
select @temp_name= name
FROM sys.objects
WHERE DATEDIFF(day, create_date, getdate()) > 3
and name = 'DrinkSales'
select @temp_name
--if object_id('dbo.DrinkSales', 'U') is not null -- this should be changed to
--drop table dbo.DrinkSales
*if @temp_name is not null *
*drop dbo.drinksales*
(1 row affected)
我认为你是 over-quoting - 动态中的常见问题 SQL。
您可以(并且应该)最小化所需的动态 SQL,如下所示:
declare @schema varchar(100) = 'dbo', @table varchar(100) = 'Proposal', @temp_name varchar(100);
if exists (
select 1
from sys.objects
where datediff(day, create_date, getdate()) > 3
and [name] = @table
and [schema_id] = schema_id(@schema)
)
begin
declare @drop varchar(max) = 'drop table ' + quotename(@schema) + '.' + quotename(@table) + ';';
print(@drop)
--exec(@drop)
end;
使用 quotename
来防止 SQL 注入很重要。
另请注意按照@David Browne 的建议添加模式。
所以我希望第一段代码找到 table 名称,然后如果 table 名称存在并且超过 3 天,则删除 table。
我对这段代码的问题是代码没有用实际的 table DrinkSales 替换 @temp_name
。所以在 select 语句中没有正确设置变量。
当前代码:
declare @table varchar(100) = 'DrinkSales'
DECLARE @temp_name VARCHAR(100)
declare @drop varchar(max) = '
DECLARE @temp_name VARCHAR(100)
select @temp_name= name
FROM sys.objects
WHERE DATEDIFF(day, create_date, getdate()) > 3
and name = '''+@table+'''
select @temp_name
--if object_id(''dbo.'+@table+''', ''U'') is not null -- needs to be changed to detect if variable is null rather than table.
--drop table dbo.'+@table+'
'
print(@drop)
exec(@drop)
所以结果应该是:
DECLARE @temp_name VARCHAR(100)
select @temp_name= name
FROM sys.objects
WHERE DATEDIFF(day, create_date, getdate()) > 3
and name = 'DrinkSales'
select @temp_name
--if object_id('dbo.DrinkSales', 'U') is not null -- this should be changed to
--drop table dbo.DrinkSales
*if @temp_name is not null *
*drop dbo.drinksales*
(1 row affected)
我认为你是 over-quoting - 动态中的常见问题 SQL。
您可以(并且应该)最小化所需的动态 SQL,如下所示:
declare @schema varchar(100) = 'dbo', @table varchar(100) = 'Proposal', @temp_name varchar(100);
if exists (
select 1
from sys.objects
where datediff(day, create_date, getdate()) > 3
and [name] = @table
and [schema_id] = schema_id(@schema)
)
begin
declare @drop varchar(max) = 'drop table ' + quotename(@schema) + '.' + quotename(@table) + ';';
print(@drop)
--exec(@drop)
end;
使用 quotename
来防止 SQL 注入很重要。
另请注意按照@David Browne 的建议添加模式。