renglones que pasar filas fila ejemplo convertir con columnas columna sql-server sql-server-2005 ddl

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