SQL Server 2005 - ¿Declaración SQL para eliminar claves agrupadas de tablas basadas en una consulta sobre nombres de tablas?

StackOverflow https://stackoverflow.com/questions/1222432

Pregunta

Estoy tratando de restaurar una copia de seguridad de una base de datos de Microsoft Dynamics NAV, que desafortunadamente falla al intentar establecer una CLAVE CLUSTRADA para las tablas que ya tienen claves agrupadas.

En NAV, cada empresa de la base de datos obtiene su propia copia de las tablas, con el prefijo del nombre de la empresa, p. COMPANY $ User_Setup . Por lo tanto, me gustaría eliminar cualquier clave agrupada en una empresa determinada, lo que significa en cualquier tabla cuyo nombre comienza con 'Empresa $'.

¿Alguien tiene una declaración SQL que pueda realizar esto?

¡Gracias de antemano!

Saludos cordiales, Martin

¿Fue útil?

Solución

Tendrá que hacerlo como un cursor. Suponiendo que cada restricción PK se nombra de manera coherente y se basa en el nombre de la tabla, podrá hacer algo como (no probado, por lo que puede contener errores tipográficos o errores de sintaxis de vauge):

DECLARE mycursor CURSOR FOR SELECT name FROM sysobjects WHERE name LIKE 'Company$%'

OPEN CURSOR
FETCH NEXT FROM mycursor INTO @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = N'ALTER TABLE QUOTENAME(' + @tablename + ') DROP CONSTRAINT PK_' + @tablename 
    EXEC sp_ExecuteSQL @sql
    FETCH NEXT FROM mycursor INTO @tablename
END

CLOSE CURSOR
DEALLOCATE CURSOR

Si sus PK no se nombran según el nombre de la tabla, deberá modificar esto para consultar también en función de sysconstraints o sysindexes para obtener el nombre real de PK.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top