我从像这样的特定数据库中获取表名
SELECT name FROM sys.Tables where name like 'some pattern'
Output :
Name
sampletable_123,
sampletable_456,
sample_789.
它可以像上面的输出一样返回多行。如何逐个获取行?
因为我想从获得的表名中找出列名/日期。如果日期小于当前日期,我想删除该表。
select top 1 Udate from sampletable_123
where Udate < convert(varchar(10),getdate(),101)
delete table sampletable_123.
怎么做?
答案 0 :(得分:1)
这将生成您可以预览的动态sql脚本,如果这些是您要删除的表,则可以在其上使用EXEC。
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = ''
SELECT
@SQL += 'IF (OBJECT_ID(' + name + ') IS NOT NULL AND NOT EXISTS(SELECT TOP 1 uDate FROM ' + name + ' WHERE DATEDIFF(day,uDate,GETDATE()) != 0)
DROP TABLE ' + name + CHAR(10)
FROM sys.Tables
where name like 'some pattern'
PRINT @SQL --print will show you the delete query that was generated
--keep in mind that print wont be able to print the whole query if its bigger than 4000 characters
--but exec will still run it
--another way to preview it is to select the query because select has no limit it's just on one row
--EXEC(@SQL)
答案 1 :(得分:1)
您可以在上面的选择中使用光标,并一次获取一行。 对于每一行,您可以检索表的第一行并决定是否删除它。
DECLARE @TABLES CURSOR
DECLARE @MYNAME VARCHAR(100)
SET @TABLES CURSOR FOR
SELECT name FROM sys.Tables WHERE name LIKE 'sample%'
OPEN @TABLES
WHILE 1 = 1 BEGIN -- INFINITE LOOP
FETCH NEXT FROM @TABLES INTO @MYNAME
IF @@FETCH_STATUS <> 0 BREAK
IF EXISTS(SELECT TOP 1 Udate FROM @MYNAME WHERE Udate < CONVERT(VARCHAR(10),GETDATE(),101))
DROP TABLE @MYNAME
END
答案 2 :(得分:0)
感谢SubqueryCrunch和Sergio Internicola的帮助。@ Sergio Internicola,你的逻辑是正确的。我认为curser需要时间。我修改了SubqueryCrunch的查询。它对我很好。
DECLARE @SQL NVARCHAR(4000)
SET @SQL = ' '
SELECT
@SQL += 'IF EXISTS(SELECT TOP 1 udate FROM ' + name + ' WHERE DATEDIFF(day,udate,GETDATE()) != 0)
DROP TABLE ' + name +' '
FROM sys.Tables
where name like 'tbl_%'
PRINT @SQL
EXEC sp_executesql @SQL