下图是 Microsoft SQL Server 2008 R2 系统视图的一部分。sys.partitions从图中我们可以看出和之间的关系sys.allocation_units取决于 的值sys.allocation_units.type。因此,要将它们连接在一起,我会写一些类似的东西:
sys.partitions
sys.allocation_units
sys.allocation_units.type
SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) THEN a.container_id = p.hobt_id WHEN a.type IN (2) THEN a.container_id = p.partition_id END
但是上面的代码给出了语法错误。我想那是因为CASE声明。谁能帮忙解释一下?
CASE
添加错误信息:
消息 102,级别 15,状态 1,第 6 行 ‘=’ 附近的语法不正确。
CASE表达式从子句的一部分返回一个值THEN。你可以这样使用它:
THEN
SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1 WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1 ELSE 0 END = 1
请注意,您需要对返回的值做一些事情,例如将其与 1 进行比较。您的语句试图返回赋值或测试相等性的值,这在CASE/THEN子句的上下文中都没有意义。(如果BOOLEAN是数据类型,那么相等性的测试是有意义的。)
BOOLEAN