2011-10-31 18 views
10

Próbuję bardzo prosty drop column oświadczenie:Czy statystyki odnoszące się do kolumny uniemożliwiają zrzucenie tej kolumny?

alter table MyTable drop column MyColumn 

i odbierania kilka błędów wzdłuż linii

Msg 5074, Level 16, State 1, wiersz 1
_dta_stat_1268251623_3_2 statystyk” "zależy od kolumny" Moja kolumna ".

następnie ostatecznie przez

Msg 4922, Level 16, State 9, wiersz 1
ALTER TABLE DROP COLUMN MyColumn powiodła się, ponieważ jeden lub więcej obiektów dostęp do tej kolumny.

Nie sądziłem, że statystyki zapobiegają upuszczeniu kolumny. Czy oni? Jeśli tak, ponieważ są to automatycznie tworzone statystyki, nie mogę polegać na tym, że nazwy są takie same na wielu kopiach tej samej bazy danych, więc jak mogę usunąć wszystkie takie statystyki w skrypcie aktualizacyjnym do wykonania w innej bazie danych?

Odpowiedz

7

Statystyki wygenerowane automatycznie, które widziałem wszystkie mają nazwę indeksu, który reprezentują LUB zaczynają się od czegoś podobnego do WA_Sys_.

Czy jesteś w 100% pewien, że nie jest to zestaw niestandardowych statystyk, które ktoś skonfigurował?

Sprawdź to:

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

... i zobaczyć, co wskazuje pole user_created.

na komentarz:

To niesprawdzone, ale można spróbować czegoś takiego:

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' 

Zmienianie PRINT do EXEC jeśli wygląda dobrze.

sp_msforeachdb to kursor w tle, ale pozostałą część logiki można wykonać jako zestaw.

+0

Masz rację! Wierzę, że zostały one utworzone przez Doradca dostrajania Database Engineer. Czy możesz polecić sposób usunięcia wszystkich utworzonych przez użytkownika statystyk odwołujących się do kolumny? – Daniel

+0

Można użyć innych widoków systemu 'sys.stats_columns' i' sys.columns', aby uzyskać/POŁĄCZ te informacje. – JNK

+0

Tak, muszę użyć starego kursora, żeby je upuścić. Dzięki. – Daniel

12

Kod proponowany w odpowiedzi JNK nie działa, ale pomysł jest dobry. Jeśli chcesz usunąć wszystkie statystyki utworzone przez użytkownika, moje przetestowane rozwiązanie:

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

rzeczywiście masz rację odpowiedź JNK nie działa w ogóle na serwerze sql 2008 (zapytanie nigdy nie zostało zakończone) zamieniło twój przykład na użycie sys.columns – Harrison

+0

Jak ograniczyć to przez bazę danych nie wszystkie bazy danych – MonsterMMORPG

+0

Zapytanie dotyczy tylko bieżącej bazy danych – psadac

Powiązane problemy