我正在试图找出如何在where子句中使用循环。我有这个代码,我只想要过去7天的文件名。它到目前为止工作,我只是想使代码更动态/更好:)
select a, b
from data1
where a in
(
'File_'+CAST(YEAR(GETDATE()-1)*10000+MONTH(GETDATE()-1)*100+DAY(GETDATE()-1)
AS VARCHAR)+'.TXT'
, 'File_'+CAST(YEAR(GETDATE()-2)*10000+MONTH(GETDATE()-2)*100+DAY(GETDATE()-2)
AS VARCHAR)+'.TXT'
, 'File_'+CAST(YEAR(GETDATE()-3)*10000+MONTH(GETDATE()-3)*100+DAY(GETDATE()-3)
AS VARCHAR)+'.TXT'
, 'File_'+CAST(YEAR(GETDATE()-4)*10000+MONTH(GETDATE()-4)*100+DAY(GETDATE()-4)
AS VARCHAR)+'.TXT'
, 'File_'+CAST(YEAR(GETDATE()-5)*10000+MONTH(GETDATE()-5)*100+DAY(GETDATE()-5)
AS VARCHAR)+'.TXT'
, 'File_'+CAST(YEAR(GETDATE()-6)*10000+MONTH(GETDATE()-6)*100+DAY(GETDATE()-6)
AS VARCHAR)+'.TXT'
, 'File_'+CAST(YEAR(GETDATE()-7)*10000+MONTH(GETDATE()-7)*100+DAY(GETDATE()-7)
AS VARCHAR)+'.TXT'
)
order by a
文件名称为File_YYYYMMDD.txt。
我搜索了其他地方并阅读了一些关于循环的内容,但我能想到的就是这样的东西,但它不起作用:
DECLARE @i int = 0
WHILE @i < 7 BEGIN
SET @i = @i + 1
END
select a, b
from data1
where a in
(
'File_'+CAST(YEAR(GETDATE()-@i)*10000+MONTH(GETDATE()-@i)*100+DAY(GETDATE()-@i)
AS VARCHAR)+'.TXT'
)
order by a
答案 0 :(得分:1)
不要再考虑循环了。 SQL Server不是为了循环而设计的,它设计用于集合。看看这个输出:
;WITH x AS
(
SELECT TOP (7) f = 'File_'
+ CONVERT(CHAR(8), DATEADD(DAY, -ROW_NUMBER() OVER
(ORDER BY [object_id]), CAST(GETDATE() AS DATE)), 112) + '.txt'
FROM sys.all_objects ORDER BY [object_id]
)
SELECT f FROM x;
结果:
f
-----------------
File_20130814.txt
File_20130813.txt
File_20130812.txt
File_20130811.txt
File_20130810.txt
File_20130809.txt
File_20130808.txt
现在,您如何使用此套装?
;WITH x AS
(
SELECT TOP (7) f = 'File_'
+ CONVERT(CHAR(8), DATEADD(DAY, -ROW_NUMBER() OVER
(ORDER BY [object_id]), CAST(GETDATE() AS DATE)), 112) + '.txt'
FROM sys.all_objects ORDER BY [object_id]
)
SELECT d.a, d.b FROM dbo.data1 AS d
WHERE EXISTS
(
SELECT 1 FROM x
WHERE f = d.a
)
ORDER BY d.a;