2016-04-01 26 views
0

dönmelidir bir sorgudan veri yok, ama öyle değil: SQL Server: Ben mantıksal olarak bazı verileri dönmelidir SQL Server üzerinde bir SQL sorgusu çalıştırıyorum verileri

SELECT 
    D.NAME DATABASE_NAME, T.NAME TABLE_NAME, I.NAME INDEX_NAME, 
    C.NAME COLUMN_NAME 
FROM 
    sys.dm_db_index_physical_stats (NULL, NULL, NULL , NULL, 'LIMITED') AS XXX 
INNER JOIN 
    SYS.DATABASES AS D ON D.DATABASE_ID = XXX.DATABASE_ID 
INNER JOIN 
    SYS.TABLES AS T ON T.OBJECT_ID = XXX.OBJECT_ID 
INNER JOIN 
    SYS.INDEXES AS I ON I.OBJECT_ID = T.OBJECT_ID 
INNER JOIN 
    SYS.INDEX_COLUMNS IC ON IC.OBJECT_ID = I.OBJECT_ID 
INNER JOIN 
    SYS.COLUMNS AS C ON C.OBJECT_ID = IC.OBJECT_ID 
WHERE 
    1=1 
ORDER BY 
    D.NAME, T.NAME 

sadece bu biraz çıkışları çok Running verileri:

SELECT * 
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL , NULL, 'LIMITED') 

Peki neden daha karmaşık sorgu işe yaramıyor? Doğru şeyleri katılmadan değiliz

+0

:

İşte bir örnek. Ancak, döndürdüğü gerçek veriler kullanışlı görünmüyor: Bence sizin birleşiminiz yanlış. Sorguya bakıldığında, her tablo, tam olarak doğru olmayan birleştirme işleminize göre aynı object_id (sys.databases hariç) kullanır. –

+2

Hangi veritabanını çalıştırdığınızı kontrol edin. Bunu ana veritabanında çalıştırdım ve satır döndürmedi. kendi veritabanımda çalışıyor. BTW, indeks ve sütunlara katılırken, bir tane daha koşul eklemeniz gerekir. IC.index_id = I.index_id – FLICKER

+0

Bunun tam anlamı, SQL sunucusunda olası tüm dizinleri almak ve bunları DB/TB/INDEX ile göstermektir. 'IC.index_id = I.index_id' gibi bir koşul ekleyerek ne demek istediğinizden emin değil misiniz? – robertalks

cevap

0

... Örneğin

, index_columns (tablo için) bir object_id ve (endeks için) index_id sahiptir. Indexid'in global olarak benzersiz olmadığını ancak yalnızca bu tablo (yani, object_id) bağlamında benzersiz olduğunu, dolayısıyla index_columns'ı çektiğinizde her iki sütuna da katılmanız gerektiğini unutmayın. Benim için satır bir yük verir

SELECT 
    TOP 50 
     t.name as tablename, 
     i.name as indexname, 
     c.name as columnname, 
     ic.key_ordinal, ic.is_descending_key 
FROM sys.tables t 
INNER JOIN sys.indexes i 
    ON i.object_id = t.object_id 
INNER JOIN sys.columns c 
    ON c.object_id = t.object_id 
INNER JOIN sys.index_columns ic 
    ON ic.object_id = t.object_id 
    AND ic.index_id = i.index_id 
    AND ic.column_id = c.column_id 
ORDER by t.name, i.name, c.name, ic.key_ordinal