L'immagine seguente è una parte di Microsoft SQL Server 2008 R2 System Views. Dall'immagine possiamo vedere che la relazione tra sys.partitions
e sys.allocation_units
dipende dal valore di sys.allocation_units.type
. Quindi per unirle insieme scriverei qualcosa di simile a questo:
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
Ma il codice superiore dà un errore di sintassi. Immagino che sia a causa della dichiarazione CASE
.
Qualcuno può aiutare a spiegare un po'?
Aggiungere il messaggio di errore:
Msg 102, Level 15, State 1, Line 6 Sintassi errata vicino a '='.
Un'espressione CASE
restituisce un valore dalla parte THEN
della clausola. Potreste usarla in questo modo:
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
Notate che avete bisogno di fare qualcosa con il valore restituito, per esempio confrontarlo con 1. La vostra frase ha tentato di restituire il valore di un'assegnazione o di testare l'uguaglianza, nessuna delle quali ha senso nel contesto di una clausola CASE
/THEN
. (Se BOOLEAN
fosse un tipo di dato, allora il test di uguaglianza avrebbe senso).
Invece, semplicemente JOIN a entrambe le tabelle, e nella tua clausola SELECT, restituisci i dati da quella che corrisponde:
Ti suggerisco di andare su questo link Conditional Joins in SQL Server e https://stackoverflow.com/questions/8361183/t-sql-case-statement-in-a-join-on-clause
ad esempio.
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
Modifica: Come da commenti.
Non puoi specificare la condizione di join come stai facendo. Controlla la
query sopra che non hanno errore. Ho tolto la colonna comune su e il valore della colonna di destra sarà valutato su condizione.