Tsql SQL Server 2008 R2 T-SQL:关于重新编写代码以允许创建视图的建议
我已经在SQLServer2008R2中创建了一个自定义的T-SQL查询。该代码非常适合作为T-SQL查询并返回正确的信息。作为编码新手,我对SQL为我的查询返回数据的方式很满意。不幸的是,如果要创建一个视图,我继续写这篇文章时没有意识到@variables不能被声明 因此,我无法创建视图并计划报告的自动执行。如果可以的话,我正在寻找可以用来重新编写这个查询的具体提示。该软件是vCM VMware Configuration Manager,我的T-SQL查询在创建的视图中查找信息,并返回与软件包安装进度相关的统计信息 我已经搜索过了,并与几位亲密的同事合作,试图在这里发布之前找到答案。分为两部分;这是一个创建的视图,它可以将我所需的所有信息放在一个视图中,以便于访问。第二部分在SQLServerManagementStudio查询窗口中运行良好。当我试图创建视图时,我得到了这个特定的错误 Msg 156,I5级,状态1,程序ECMCUST_进度报告,第3行 关键字“Declare”附近的语法不正确 从我在网上找到的所有信息来看,似乎需要重新编写。似乎还可以在创建视图、存储过程等时看到此问题 一个关于该往哪个方向走的提示就太棒了 这将创建有效的视图 这是在T-SQL中运行良好的代码,但我无法从中创建视图Tsql SQL Server 2008 R2 T-SQL:关于重新编写代码以允许创建视图的建议,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我已经在SQLServer2008R2中创建了一个自定义的T-SQL查询。该代码非常适合作为T-SQL查询并返回正确的信息。作为编码新手,我对SQL为我的查询返回数据的方式很满意。不幸的是,如果要创建一个视图,我继续写这篇文章时没有意识到@variables不能被声明 因此,我无法创建视图并计划报告的自动执行。如果可以的话,我正在寻找可以用来重新编写这个查询的具体提示。该软件是vCM VMware Configuration Manager,我的T-SQL查询在创建的视图中查找信息,并返回与软件
创建一个存储过程,用你所有的代码应该是最简单的方法 然而,如果您真的需要一个视图,这应该可以在未经测试的情况下完成
CREATE VIEW ECMCUST_emcmachineresults
AS
WITH cte1 AS
(
SELECT
platform_id
,SUM(CASE WHEN machine_id IS NOT NULL THEN 1 ELSE 0 END) AS WinTotal
,SUM(CASE WHEN machine_id IS NOT NULL AND ignored = 1 THEN 1 ELSE 0 END) AS Ignored
,SUM(CASE WHEN machine_id IS NOT NULL AND ignored = 1 AND data_value LIKE '*%' THEN 1 ELSE 0 END) AS IgnoredException
,COUNT(*) AS Total
,SUM(CASE WHEN ignored = 1 AND data_value <> '*%' THEN 1 ELSE 0 END) AS R1
FROM [ECMCUST_emcmachineresults]
WHERE platform_id IN (5,11,2)
GROUP BY platform_id
)
, cte2 AS
(
SELECT
CASE
WHEN platform_id = 5 THEN 'Windows'
WHEN platform_id = 11 THEN 'ESX'
WHEN platform_id = 2 THEN 'RHEL'
END AS [Machine Type],
WinTotal AS [Total Servers],
Ignored AS [Ignored Servers],
IgnoredException AS [Ignored Exceptions Servers],
Total - R1 AS [Total Managed],
CAST((Total - R1) * 1.00 /WinTotal AS DECIMAL (3, 2)) AS [Percent Complete]
FROM cte1
)
SELECT
[Machine Type],
[Total Servers],
[Ignored Servers],
[Ignored Exceptions Servers],
[Total Managed],
[Percent Complete]
FROM cte2
UNION ALL
SELECT
'ALL' AS [Machine Type],
SUM([Total Servers]),
SUM([Ignored Servers]),
SUM([Ignored Exceptions Servers]),
SUM([Total Managed]),
SUM([Percent Complete])/3
FROM cte2
您是对的,局部变量不能在视图中声明-但是为什么您不能创建存储过程呢?软件需要一个视图来通过电子邮件发送此自动报告。非常感谢。我需要一个视图,因为我正在使用的软件包将自动运行的报告保存到视图中,并通过电子邮件发送出去。谢谢你教我如何钓鱼,我回家后会试试这个,然后再发回来。经过测试,效果非常好。我确实必须给新的一个不同的视图名称,但仅此而已。
/* ------------------------------------------------------------*/
Declare @WinTotal1 as FLOAT
Declare @Ignored1 as FLOAT
Declare @IgnoredException1 as FLOAT
Declare @TotalsR1 as FLOAT
Declare @PercentComplete1 as DECIMAL(3,2)
select @WinTotal1 = COUNT(machine_id)
from [ECMCUST_emcmachineresults]
where platform_id = 5
select @Ignored1 = COUNT(machine_id)
from [ECMCUST_emcmachineresults]
where platform_id = 5
and ignored = 1
select @IgnoredException1 = COUNT(machine_id)
from [ECMCUST_emcmachineresults]
where platform_id = 5
and ignored = 1
and data_value like '*%'
SELECT @TotalsR1 =
(SELECT COUNT(*) FROM ECMCUST_emcmachineresults WHERE platform_id = 5) -
(SELECT COUNT(*) FROM ECMCUST_emcmachineresults WHERE platform_id = 5
and ignored = 1
and data_value != '*%')
SELECT @PercentComplete1 = @TotalsR1/@WinTotal1
/* ------------------------------------------------------------*/
Declare @ESXTotal2 as FLOAT
Declare @Ignored2 as FLOAT
Declare @IgnoredException2 as FLOAT
Declare @TotalsR2 as FLOAT
Declare @PercentComplete2 as DECIMAL(3,2)
select @ESXTotal2 = COUNT(machine_id)
from [ECMCUST_emcmachineresults]
where platform_id = 11
select @Ignored2 = COUNT(machine_id)
from [ECMCUST_emcmachineresults]
where platform_id = 11
and ignored = 1
select @IgnoredException2 = COUNT(machine_id)
from [ECMCUST_emcmachineresults]
where platform_id = 11
and ignored = 1
and data_value like '*%'
SELECT @TotalsR2 =
(SELECT COUNT(*) FROM ECMCUST_emcmachineresults WHERE platform_id = 11)-
(SELECT COUNT(*) FROM ECMCUST_emcmachineresults WHERE platform_id = 11
and ignored = 1
and data_value != '*%')
SELECT @PercentComplete2 = @TotalsR2/@ESXTotal2
/* ------------------------------------------------------------*/
Declare @RHELTotal3 as FLOAT
Declare @Ignored3 as FLOAT
Declare @IgnoredException3 as FLOAT
Declare @TotalsR3 as FLOAT
Declare @PercentComplete3 as DECIMAL(3,2)
select @RHELTotal3 = COUNT(machine_id)
from [ECMCUST_emcmachineresults]
where platform_id = 2
select @Ignored3 = COUNT(machine_id)
from [ECMCUST_emcmachineresults]
where platform_id = 2
and ignored = 1
select @IgnoredException3 = COUNT(machine_id)
from [ECMCUST_emcmachineresults]
where platform_id = 2
and ignored = 1
and data_value like '*%'
SELECT @TotalsR3 =
(SELECT COUNT(*) FROM ECMCUST_emcmachineresults WHERE platform_id = 2)-
(SELECT COUNT(*) FROM ECMCUST_emcmachineresults WHERE platform_id = 2
and ignored = 1
and data_value != '*%')
SELECT @PercentComplete3 = @TotalsR3/@RHELTotal3
Select
'Windows' as [Machine Type],
@WinTotal1 AS [Total Servers],
@Ignored1 AS [Ignored Servers],
@IgnoredException1 AS [Ignored Exceptions Servers],
@TotalsR1 AS [Total Managed],
@PercentComplete1 AS [Percent Complete]
union
Select
'ESX' as [Machine Type],
@ESXTotal2 AS [Total Servers],
@Ignored2 AS [Ignored Servers],
@IgnoredException2 AS [Ignored Exceptions Servers],
@TotalsR2 AS [Total Managed],
@PercentComplete2 AS [Percent Complete]
union
Select
'RHEL' as [Machine Type],
@RHELTotal3 AS [Total Servers],
@Ignored3 AS [Ignored Servers],
@IgnoredException3 AS [Ignored Exceptions Servers],
@TotalsR3 AS [Total Managed],
@PercentComplete3 AS [Percent Complete]
union
select
'All' as [Machine Type],
@WinTotal1 + @ESXTotal2 + @RHELTotal3 as [Total Servers],
@Ignored1 + @Ignored2 + @Ignored3 as [Total Ignored],
@IgnoredException1 + @IgnoredException2 + @IgnoredException3 as [Total Ignored Exceptions],
@TotalsR1 + @TotalsR2 + @TotalsR3 as [Total Managed],
(@PercentComplete1+@PercentComplete2+@PercentComplete3)/3 as [Percent Complete]
CREATE VIEW ECMCUST_emcmachineresults
AS
WITH cte1 AS
(
SELECT
platform_id
,SUM(CASE WHEN machine_id IS NOT NULL THEN 1 ELSE 0 END) AS WinTotal
,SUM(CASE WHEN machine_id IS NOT NULL AND ignored = 1 THEN 1 ELSE 0 END) AS Ignored
,SUM(CASE WHEN machine_id IS NOT NULL AND ignored = 1 AND data_value LIKE '*%' THEN 1 ELSE 0 END) AS IgnoredException
,COUNT(*) AS Total
,SUM(CASE WHEN ignored = 1 AND data_value <> '*%' THEN 1 ELSE 0 END) AS R1
FROM [ECMCUST_emcmachineresults]
WHERE platform_id IN (5,11,2)
GROUP BY platform_id
)
, cte2 AS
(
SELECT
CASE
WHEN platform_id = 5 THEN 'Windows'
WHEN platform_id = 11 THEN 'ESX'
WHEN platform_id = 2 THEN 'RHEL'
END AS [Machine Type],
WinTotal AS [Total Servers],
Ignored AS [Ignored Servers],
IgnoredException AS [Ignored Exceptions Servers],
Total - R1 AS [Total Managed],
CAST((Total - R1) * 1.00 /WinTotal AS DECIMAL (3, 2)) AS [Percent Complete]
FROM cte1
)
SELECT
[Machine Type],
[Total Servers],
[Ignored Servers],
[Ignored Exceptions Servers],
[Total Managed],
[Percent Complete]
FROM cte2
UNION ALL
SELECT
'ALL' AS [Machine Type],
SUM([Total Servers]),
SUM([Ignored Servers]),
SUM([Ignored Exceptions Servers]),
SUM([Total Managed]),
SUM([Percent Complete])/3
FROM cte2