【发布时间】:2018-01-05 21:42:04
【问题描述】:
尝试运行以下查询:
IF LEFT(CAST(SERVERPROPERTY('ProductVersion') as varchar),2) LIKE '1[2-9]'
SELECT
@@servername AS [Server]
, d.name AS [Database]
, CONVERT(char(10), d.create_date, 121) AS [Created]
, sp.name AS [Owner]
, d.recovery_model_desc AS [Recovery]
, CASE d.state_desc WHEN 'OFFLINE' THEN '***OFFLINE***' ELSE d.state_desc END AS [Status]
, d.user_access_desc AS [Access]
, CASE d.is_read_only WHEN 0 THEN 'READ_WRITE' WHEN 1 THEN 'READ_ONLY' END AS Updateability
, CASE d.is_fulltext_enabled WHEN 0 THEN '' WHEN 1 THEN 'YES' END AS [FullText]
, CASE d.is_auto_create_stats_on WHEN 0 THEN '' WHEN 1 THEN 'YES' END AS [CreateStats]
, CASE d.is_auto_update_stats_on WHEN 0 THEN '' WHEN 1 THEN 'YES' END AS [UpdateStats]
, CASE d.page_verify_option
WHEN 0 THEN '***NONE***'
WHEN 1 THEN '***TORN PAGE DETECTION***' -- outdated in 2005+. Change to checksum.
ELSE d.page_verify_option_desc
END AS [Page Verify]
, d.compatibility_level AS [Level]
, d.target_recovery_time_in_seconds as ckp_s
, d.log_reuse_wait_desc AS [Log Wait]
, d.collation_name AS [Collation]
, CASE d.is_read_committed_snapshot_on WHEN 0 THEN '' WHEN 1 THEN 'YES' END AS [RCS]
, CASE d.snapshot_isolation_state WHEN 0 THEN '' WHEN 1 THEN 'YES' END AS [SI]
, CASE d.is_query_store_on WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' END AS QS
, CASE d.is_auto_close_on WHEN 0 THEN '' WHEN 1 THEN '***YES***' /*always disable auto close*/ END AS [AutoClose]
, CASE d.is_auto_shrink_on WHEN 0 THEN '' WHEN 1 THEN '***YES***' /*always disable auto shrink*/ END AS [AutoShrink]
, d.delayed_durability_desc as [Durability]
FROM sys.databases AS d
LEFT JOIN sys.server_principals AS sp /*get database owner name */ ON sp.sid = d.owner_sid
WHERE d.database_id > 4 -- exclude system DBs
ORDER BY d.name;
ELSE
SELECT
@@servername AS [Server]
, d.name AS [Database]
, CONVERT(char(10), d.create_date, 121) AS [Created]
, sp.name AS [Owner]
, d.recovery_model_desc AS [Recovery]
, CASE d.state_desc WHEN 'OFFLINE' THEN '***OFFLINE***' ELSE d.state_desc END AS [Status]
, d.user_access_desc AS [Access]
, CASE d.is_read_only WHEN 0 THEN 'READ_WRITE' WHEN 1 THEN 'READ_ONLY' END AS Updateability
, CASE d.is_fulltext_enabled WHEN 0 THEN '' WHEN 1 THEN 'YES' END AS [FullText]
, CASE d.is_auto_create_stats_on WHEN 0 THEN '' WHEN 1 THEN 'YES' END AS [CreateStats]
, CASE d.is_auto_update_stats_on WHEN 0 THEN '' WHEN 1 THEN 'YES' END AS [UpdateStats]
, CASE d.page_verify_option
WHEN 0 THEN '***NONE***'
WHEN 1 THEN '***TORN PAGE DETECTION***' -- outdated in 2005+. Change to checksum.
ELSE d.page_verify_option_desc
END AS [Page Verify]
, d.compatibility_level AS [Level]
, 'N/A' AS ckp_s
, d.log_reuse_wait_desc AS [Log Wait]
, d.collation_name AS [Collation]
, CASE d.is_read_committed_snapshot_on WHEN 0 THEN '' WHEN 1 THEN 'YES' END AS [RCS]
, CASE d.snapshot_isolation_state WHEN 0 THEN '' WHEN 1 THEN 'YES' END AS [SI]
, 'N/A' AS QS
, CASE d.is_auto_close_on WHEN 0 THEN '' WHEN 1 THEN '***YES***' /*always disable auto close*/ END AS [AutoClose]
, CASE d.is_auto_shrink_on WHEN 0 THEN '' WHEN 1 THEN '***YES***' /*always disable auto shrink*/ END AS [AutoShrink]
, 'N/A' AS [Durability]
FROM sys.databases AS d
LEFT JOIN sys.server_principals AS sp /*get database owner name */ ON sp.sid = d.owner_sid
WHERE d.database_id > 4 -- exclude system DBs
ORDER BY d.name;
问题在于 SQL Server 2005/2008/2012。 sys.databases 表中不存在列 target_recovery_time_in_seconds, is_query_store_on, and delayed_durability_desc。
顶部的 IF 语句查找它是什么版本的 SQL Server。如果是 2014+,请使用这 3 列运行查询。如果没有,请在没有这 3 列的情况下运行查询。我在其他查询中使用了这个逻辑并且它有效,但在这种情况下它没有。我收到以下错误:
消息 207,第 16 级,状态 1,第 20 行
列名“target_recovery_time_in_seconds”无效。消息 207,第 16 级,状态 1,第 25 行
列名“is_query_store_on”无效。消息 207,第 16 级,状态 1,第 25 行
列名“is_query_store_on”无效。消息 207,第 16 层,状态 1,第 28 行
列名“delayed_durability_desc”无效。`
我的问题是为什么 SQL Server 不读取 IF 语句?如果是这样,它将跳过包含 3 列的查询并运行没有它的查询。
【问题讨论】:
-
它不会跳过
IF语句......它只会在执行时验证它;但在执行之前,SQL Server 会验证您的整个查询。
标签: sql sql-server