如何在sql中逐个获取行

时间:2015-09-25 09:39:33

标签: sql asp.net sql-server

我从像这样的特定数据库中获取表名

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.

怎么做?

3 个答案:

答案 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