sql-server - que - pivot con dos columnas sql server
¿Las estadísticas que hacen referencia a una columna evitan que esa columna se descarte? (2)
Estoy intentando una declaración de drop column
muy simple:
alter table MyTable drop column MyColumn
y recibiendo varios errores a lo largo de las líneas de
Msg 5074, nivel 16, estado 1, línea 1
Las estadísticas ''_dta_stat_1268251623_3_2'' dependen de la columna ''MyColumn''.
seguido en última instancia por
Msg 4922, nivel 16, estado 9, línea 1
ALTER TABLE DROP COLUMN MyColumn falló porque uno o más objetos acceden a esta columna.
No pensé que las estadísticas impidieran que se descartara una columna. ¿Ellos? Si es así, dado que aparentemente se trata de estadísticas creadas automáticamente, no puedo depender de que los nombres sean los mismos en varias copias de la misma base de datos, así que ¿cómo podría dejar todas esas estadísticas en un script de actualización para ejecutarlas en una base de datos diferente?
Las estadísticas generadas automáticamente que he visto tienen el nombre del índice que representan O comienzan con algo como WA_Sys_
.
¿Estás 100% seguro de que este no es un conjunto de estadísticas personalizadas que alguien configuró?
Mira esto:
select *
FROM sys.stats WHERE name = ''_dta_stat_1268251623_3_2''
... y ver qué indica el campo user_created
el user_created
.
Por comentario:
Esto no se ha probado, pero podrías probar algo como:
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''
Cambie la PRINT
a un EXEC
si se ve bien.
sp_msforeachdb
es un cursor en el fondo pero el resto de la lógica lo puedes hacer como un conjunto.
El código propuesto en la respuesta JNK no funciona, pero la idea es buena. Si desea eliminar todas las estadísticas creadas por el usuario, esta es mi solución probada:
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