A imagem seguinte faz parte do Microsoft SQL Server 2008 R2 System Views. Da imagem podemos ver que a relação entre sys.partitions' e
sys.allocation_units' depende do valor de `sys.allocation_units.type'. Então para juntá-las eu escreveria algo similar a isto:
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
Mas o código superior dá um erro de sintaxe. Acho que isso's por causa da declaração CASE
.
Alguém pode ajudar a explicar um pouco?
Adicionar mensagem de erro:
Msg 102, Level 15, State 1, Line 6 Sintaxe incorrecta perto de '='.
Uma expressão CASE
retorna um valor da parte THEN
da cláusula. Você poderia utilizá-la assim:
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
Note que você precisa fazer algo com o valor retornado, por exemplo, compará-lo com 1. Sua declaração tentou retornar o valor de uma atribuição ou teste de igualdade, nenhum dos quais faz sentido no contexto de uma cláusula "CASE"/THEN". (Se o
BOOLEAN` fosse um datatype então o teste para igualdade faria sentido).
Em vez disso, você simplesmente se junta a ambas as tabelas, e na sua cláusula SELECT, devolver dados daquele que corresponde:
Eu sugiro que você passe por este link Conditional Joins in SQL Server e https://stackoverflow.com/questions/8361183/t-sql-case-statement-in-a-join-on-clause
por exemplo
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
Editar: De acordo com os comentários.
Não é possível especificar a condição de adesão como se está a fazer. Verificar a condição de consulta acima que não tem erro. Eu retirei a coluna comum para cima e o valor da coluna da direita será avaliado na condição.