下面的图片是Microsoft SQL Server 2008 R2系统视图的一部分。从图片中我们可以看到,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
语句。
谁能帮助解释一下?
添加错误信息。
Msg 102, Level 15, State 1, Line 6 在'='附近语法不正确。
一个CASE
表达式从子句的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 "是一个数据类型,那么平等测试就有意义了)。
相反,你只需对两个表进行JOIN,并在你的SELECT子句中。 返回匹配的数据。
我建议你通过这个链接SQL Server中的条件连接和https://stackoverflow.com/questions/8361183/t-sql-case-statement-in-a-join-on-clause。
比如说
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON a.container_id =
CASE
WHEN a.type IN (1, 3)
THEN p.hobt_id
WHEN a.type IN (2)
THEN p.partition_id
END
编辑:根据评论。
你不能像你现在这样指定连接条件。检查上面的 上面的查询,没有错误。我已经把普通列拿出来了 ,右边的列值将在条件下被评估。