¿Crear vista en una base de datos especificada con sql dinámico?


16

Estoy escribiendo un sql dinámico para soltar y crear una vista en una base de datos diferente.

Entonces escribí:

set @CreateViewStatement = 
                '
                USE ['+ @DB +'];
                CREATE VIEW [dbo].[MyTable]
                AS

                SELECT ........something
exec (@CreateViewStatement)

Me da error:

'CREAR VISTA' debe ser la primera instrucción en un lote de consulta.

Si elimino la instrucción USE DATABASE funciona bien, pero la base de datos ya no se especifica ...

¿Como puedó resolver esté problema?

Respuestas:


25

Puedes usar EXECllamadas anidadas . El contexto de la base de datos modificado por USEpersiste en el lote secundario.

DECLARE @DB SYSNAME

SET @DB = 'tempdb'

DECLARE @CreateViewStatement NVARCHAR(MAX) 
SET @CreateViewStatement = '
      USE '+ QUOTENAME(@DB) +';
      EXEC(''
             CREATE VIEW [dbo].[MyTable] AS
             SELECT 1 AS [Foo]
      '')

                          '
EXEC (@CreateViewStatement)

1
+1: si crea secuencias de comandos de vistas utilizando SMO, así es como lo hace el marco también: las definiciones se ejecutan en SQL dinámico para sortear la restricción
JNK

1
@KingChan: puedes votar y aceptar, para tu información;)
JNK

@JNK +1 por supuesto ~ :)
Rey Chan

definitivamente funcionó !! Aunque lo usé, con muchas variables dentro de la consulta anidada, ¡me dolía la cabeza por el manejo de las cotizaciones! ¡gran solución sin embargo!

Usted es un héroe. Nombrará a mi primogénito después de ti.
Jens

-1

Una forma que he manejado cuando me encuentro con este caso es colocar GO después de la declaración de uso.

set @CreateViewStatement = 
'
  USE ['+ @DB +']; GO
  CREATE VIEW [dbo].[MyTable]
  AS

  SELECT ........something'
exec (@CreateViewStatement)

Para que lo sepas, GO Statment no se ejecutará en ejecutivo
King Chan

2
Esto no funcionará en el contexto de SQL dinámico. GOes un delimitador por lotes en las herramientas del cliente, no una palabra clave TSQL.
Martin Smith
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.