Aşağıdaki görüntü Microsoft SQL Server 2008 R2 Sistem Görünümleri'nin bir parçasıdır. Resimden sys.partitions
ve sys.allocation_units
arasındaki ilişkinin sys.allocation_units.type
değerine bağlı olduğunu görebiliriz. Dolayısıyla, bunları birleştirmek için şuna benzer bir şey yazardım:
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
Ancak üstteki kod sözdizimi hatası veriyor. Sanırım bunun nedeni CASE
ifadesi.
Birisi biraz açıklamaya yardımcı olabilir mi?
Hata mesajı ekleyin:
Msg 102, Düzey 15, Durum 1, Satır 6 '=' yakınında hatalı sözdizimi.
Bir CASE
ifadesi, cümlenin THEN
kısmından bir değer döndürür. Bunu şu şekilde kullanabilirsiniz:
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
Dönen değerle bir şey yapmanız gerektiğine dikkat edin, örneğin 1 ile karşılaştırın. İfadeniz bir atamanın değerini döndürmeye veya eşitliği test etmeye çalıştı, bunların ikisi de CASE
/THEN
cümlesi bağlamında mantıklı değildir. (Eğer BOOLEAN
bir veri tipi olsaydı, o zaman eşitlik testi mantıklı olurdu).
Bunun yerine, her iki tabloya ve SELECT cümlenize JOIN yapmanız yeterlidir, eşleşen veriyi döndürür:
Bu bağlantıyı SQL Server'da Koşullu Birleştirmeler ve https://stackoverflow.com/questions/8361183/t-sql-case-statement-in-a-join-on-clause adresini incelemenizi öneririm.
Örneğin.
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
Düzenleme: Yorumlara göre.
Yaptığınız gibi birleştirme koşulunu belirtemezsiniz. Kontrol edin Yukarıdaki sorguda hata yok. Ortak sütunu yukarı çıkardım ve sağ sütun değeri koşulda değerlendirilecektir.