2011-10-31 7 views
10

Sto cercando un semplice drop column dichiarazione:Le statistiche che fanno riferimento a una colonna impediscono il rilascio di quella colonna?

alter table MyTable drop column MyColumn 

e la ricezione di diversi errori lungo le linee di

Msg 5074, livello 16, stato 1, riga 1
_dta_stat_1268251623_3_2 Le statistiche' 'dipende dalla colonna' MyColumn '.

seguita infine da

Msg 4922, livello 16, stato 9, linea 1
ALTER TABLE DROP COLUMN MyColumn riuscita perché uno o più oggetti accedono a questa colonna.

Non pensavo che le statistiche impedissero la caduta di una colonna. Fanno? In tal caso, poiché si tratta di statistiche apparentemente create automaticamente, non posso dipendere dal fatto che i nomi siano gli stessi su più copie dello stesso database, quindi come posso eliminare tutte le statistiche in uno script di aggiornamento da eseguire su un altro database?

risposta

7

Le statistiche generate automaticamente che ho visto tutte hanno il nome dell'indice che rappresentano O iniziano con qualcosa come WA_Sys_.

Sei sicuro al 100% che questo non è un insieme di statistiche personalizzate che qualcuno ha impostato?

Controllare questo:

select * 
FROM sys.stats WHERE name = '_dta_stat_1268251623_3_2' 

... e vedere che cosa il campo user_created indica.

Per commento:

Questo non è testato, ma si potrebbe provare qualcosa di simile:

exec sp_MSforeachdb ' 
use ? 

DECLARE @SQL varchar(max) = '''' 

select @SQL = @SQL + ''DROP STATISTICS '' + OBJECT_NAME(c.object_id) + ''.'' + s.name + CHAR(10) + CHAR(13) 
from sys.stats s 
INNER JOIN sys.stats_columns sc 
ON sc.stats_id = s.stats_id 
INNER JOIN sys.columns c 
ON c.column_id = sc.column_id 
WHERE c.name = ''ClaimNbr'' 
--and s.user_created = 1 

PRINT @SQL' 

Modificare il PRINT a un EXEC se si guarda bene.

sp_msforeachdb è un cursore sullo sfondo ma il resto della logica è possibile eseguire come un set.

+0

Hai ragione! Credo che questi siano stati creati da Ottimizzazione guidata motore di database. Puoi consigliare un modo per eliminare tutte le statistiche create dall'utente che fanno riferimento a una colonna? – Daniel

+0

È possibile utilizzare le altre viste di sistema 'sys.stats_columns' e' sys.columns' per ottenere/UNIRE tali informazioni. – JNK

+0

Sì, devo ricorrere al tuo vecchio cursore per lasciarli cadere. Grazie. – Daniel

12

Il codice proposto in risposta JNK non funziona, ma l'idea è buona. Se si desidera eliminare tutte le statistiche create dall'utente questa mia soluzione testata:

DECLARE @sql NVARCHAR(MAX) 

DECLARE statCursor CURSOR FOR 
SELECT 
    'DROP STATISTICS ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) 
         + '.' + QUOTENAME(t.name) 
         + '.' + QUOTENAME(st.name) AS sql 
FROM 
    sys.stats AS st 
    INNER JOIN sys.tables AS t 
     ON st.object_id = t.object_id 
WHERE 
    st.user_created = 1 
ORDER BY 1; 

OPEN statCursor; 

FETCH NEXT FROM statCursor INTO @sql 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT @sql 
    EXEC sp_executesql @sql 
    FETCH NEXT FROM statCursor INTO @sql 
END 
CLOSE statCursor 
DEALLOCATE statCursor 
+0

si è effettivamente corretti La risposta JNK non ha funzionato del tutto su SQL Server 2008 (la query non è mai stata completata) ha cambiato l'esempio per utilizzare sys.columns – Harrison

+0

Come limitare questo da un database non tutti i database – MonsterMMORPG

+0

La query si applica solo al database corrente – psadac

Problemi correlati