Jef*_*eff 21 sql-server-2008 sql-server-2008-r2
有人可以给我看一个示例SQL服务器脚本,我可以看看它使用"With Clause"吗?
我试图使用此子句迭代200个数据库,这些数据库包含我尝试运行查询的同一个表.我试图避免使用游标,因为查询时间太长以及使用while循环.
有人可以告诉我我能做什么.
谢谢.
Ric*_*iwi 36
只是一个戳,但这是写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
Run Code Online (Sandbox Code Playgroud)
但是SQL Server 2005及以上版本背后的实际功能(称为Common Table Expression http://msdn.microsoft.com/en-us/library/ms190766.aspx"CTE ")是Recursion,如下表所示通过迭代构建,每次都添加到虚拟表.
;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
Run Code Online (Sandbox Code Playgroud)
要在所有数据库中运行类似的查询,可以使用未记录的sp_msforeachdb.在另一个答案中已经提到过,但它是sp_msforeachdb,而不是sp_foreachdb.
但是在使用它时要小心,因为有些东西不是你所期望的.考虑这个例子
exec sp_msforeachdb 'select count(*) from sys.objects'
Run Code Online (Sandbox Code Playgroud)
您将获得报告的SAME计数,而不是每个数据库中的对象计数,从当前数据库的计数开始.要解决这个问题,请始终先"使用"数据库.请注意方括号以限定多字数据库名称.
exec sp_msforeachdb 'use [?]; select count(*) from sys.objects'
Run Code Online (Sandbox Code Playgroud)
有关填充计数表的特定查询,可以使用如下所示的内容.不确定DATE列,所以此tally表只有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
Run Code Online (Sandbox Code Playgroud)
有两种类型的WITH子句:
这是SQL表单中的FizzBuzz,使用WITH公用表表达式(CTE).
;WITH mil AS (
SELECT TOP 1000000 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
FROM master.sys.all_columns as c
CROSS JOIN master.sys.all_columns as c2
)
SELECT CASE WHEN n % 3 = 0 THEN
CASE WHEN n % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
WHEN n % 5 = 0 THEN 'Buzz'
ELSE CAST(n AS char(6))
END + CHAR(13)
FROM mil
Run Code Online (Sandbox Code Playgroud)
这是一个使用WITH子句的select语句
SELECT * FROM orders WITH (NOLOCK) where order_id = 123
Run Code Online (Sandbox Code Playgroud)