Pregunta

quiero modificar una tabla para agregar una restricción durante la actualización de una base de datos SQL Server.

Esta tabla está indexada normalmente en un grupo de archivos llamado 'MY_INDEX' - pero también puede ser en una base de datos sin este grupo de archivos. En este caso quiero la indexación sea hecha en el grupo de archivos 'primario'.

Me trató el siguiente código para lograr esto:

DECLARE @fgName AS VARCHAR(10)

SET @fgName = CASE WHEN EXISTS(SELECT groupname
                                FROM sysfilegroups
                                WHERE groupname = 'MY_INDEX')
                    THEN QUOTENAME('MY_INDEX')
                    ELSE QUOTENAME('PRIMARY')
              END

ALTER TABLE [dbo].[mytable]
ADD CONSTRAINT [PK_mytable] PRIMARY KEY
(
    [myGuid] ASC
)
ON @fgName -- fails: 'incorrect syntax'

Sin embargo, la última línea de falla, ya que aparece un grupo de archivos no puede ser especificado por la variable.

¿Es esto posible?

¿Fue útil?

Solución

He encontrado que SQL dinámico funciona al pasar variables en las instrucciones de DDL.

intentar algo como esto:

DECLARE @fgName AS VARCHAR(10) 

SET @fgName = CASE WHEN EXISTS(SELECT groupname 
                                FROM sysfilegroups 
                                WHERE groupname = 'MY_INDEX') 
                    THEN QUOTENAME('MY_INDEX') 
                    ELSE QUOTENAME('PRIMARY') 
              END 

DECLARE @sql as varchar(1024)

SET @sql = 'ALTER TABLE [dbo].[mytable] ADD CONSTRAINT [PK_mytable] PRIMARY KEY ( 
    [myGuid] ASC ) ON ' + @fgName

EXEC(@sql)

Espero que ayude ....

Otros consejos

Me creería que si SQL Server devuelve un incorrect syntax, probablemente no hay manera de hacer esto, por desgracia.

Se deberá especificar los nombres de grupos de archivos como literales de cadena.

Es probable que sólo tiene que volver a escribir su guión a ser algo como:

IF EXISTS(SELECT groupname FROM sysfilegroups WHERE groupname = 'MY_INDEX')
     ALTER TABLE [dbo].[mytable]
       ADD CONSTRAINT [PK_mytable] 
       PRIMARY KEY([myGuid] ASC) ON 'MY_INDEX'
ELSE
     ALTER TABLE [dbo].[mytable]
       ADD CONSTRAINT [PK_mytable] 
       PRIMARY KEY([myGuid] ASC) ON 'PRIMARY'

Reemplazar ELSE QUOTENAME('PRIMARY') con ELSE QUOTENAME('[PRIMARY]')

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