只是一个戳,但这里有另一种写 FizzBuzz 的方法 :)
我认为 100 行足以显示 WITH 语句。
;WITH t100 AS (
SELECT n=number
FROM master..spt_values
WHERE type='P' and number between 1 and 100
)
SELECT
ISNULL(NULLIF(
CASE WHEN n % 3 = 0 THEN 'Fizz' Else '' END +
CASE WHEN n % 5 = 0 THEN 'Buzz' Else '' END, ''), RIGHT(n,3))
FROM t100
但在 SQL Server 2005 及更高版本中 WITH(称为通用表表达式 http://msdn.microsoft.com/en-us/library/ms190766.aspx“CTE”)背后的真正强大之处在于递归,如下所示,表是通过每次添加到虚拟表的迭代来构建的.
;WITH t100 AS (
SELECT n=1
union all
SELECT n+1
FROM t100
WHERE n < 100
)
SELECT
ISNULL(NULLIF(
CASE WHEN n % 3 = 0 THEN 'Fizz' Else '' END +
CASE WHEN n % 5 = 0 THEN 'Buzz' Else '' END, ''), RIGHT(n,3))
FROM t100
要在所有数据库中运行类似的查询,您可以使用未记录的 sp_msforeachdb。在另一个答案中已经提到过,但它是 sp_msforeachdb,而不是 sp_foreachdb。
使用它时要小心,因为有些事情不是你所期望的。考虑这个例子
exec sp_msforeachdb 'select count(*) from sys.objects'
您将得到报告的相同计数,而不是每个 DB 中的对象计数,从当前 DB 开始。
要解决这个问题,请始终首先“使用”数据库。请注意方括号以限定多词数据库名称。
exec sp_msforeachdb 'use [?]; select count(*) from sys.objects'
对于有关填充计数表的特定查询,您可以使用如下所示的内容。不确定 DATE 列,因此此计数表只有 DBNAME 和 IMG_COUNT 列,但希望对您有所帮助。
create table #tbl (dbname sysname, img_count int);
exec sp_msforeachdb '
use [?];
if object_id(''tbldoc'') is not null
insert #tbl
select ''?'', count(*) from tbldoc'
select * from #tbl