2010-12-08 14 views
5

En las opciones de "Script to", puede elegir crear un script para crear lo que desee. ¿Hay alguna forma de obtener una estructura de tabla coincidente para una vista usando un método similar?¿Es posible crear un script de una vista como una tabla en SQL Server?

+1

¿Quiere decir generar una declaración 'CREATE TABLE' basada en las columnas seleccionadas en la definición de una Vista? Hasta donde yo sé ... –

+0

Esta pregunta me recordó a http://stackoverflow.com/questions/21547/in-sql-server-how-do-i-generate-a-create-table-statement -for-a-given-table, que puede o no ayudarlo. – Justin

+0

@djacobson, estoy empezando a pensar que tienes razón. Publicarlo como una respuesta y lo aceptaré. –

Respuesta

28

Puede hacer SELECT INTO desde la Vista a una nueva tabla y luego ejecutar esa secuencia de comandos.

SELECT TOP 0 * INTO NewTable FROM YourView 

Podría ahorrar un poco de tipeo si ese es el motivo de la pregunta.

+0

Es la estructura de la tabla que quiero reproducir, no los datos. –

+1

¡Es por eso que no se han insertado datos! una vez que exista la nueva tabla, puede usar la funcionalidad SSMS estándar para realizar su secuencia de comandos. –

+0

Estoy confundido, ¿estás diciendo que necesito crear la tabla manualmente? –

2

Si quiere decir generar una declaración CREATE TABLE basada en las columnas seleccionadas en la definición de una Vista, no estoy al tanto de ninguna manera de hacerlo sin pasos intermedios, como lo que sugiere @Martin.

7

Esto es lo que estamos usando para hacer esto.

Todo el crédito para el siguiente va al puesto más alto here y @Zanlok cuya versión revisada que he usado y ammended mirar vistas en lugar de tablas:



    SELECT 
     t.TABLE_CATALOG, 
     t.TABLE_SCHEMA, 
     t.TABLE_NAME, 
     'create table '+QuoteName(t.TABLE_SCHEMA)+'.' + QuoteName(so.name) + ' (' + LEFT(o.List, Len(o.List)-1) + '); ' 
      + CASE WHEN tc.Constraint_Name IS NULL THEN '' 
       ELSE 
       'ALTER TABLE ' + QuoteName(t.TABLE_SCHEMA)+'.' + QuoteName(so.name) 
       + ' ADD CONSTRAINT ' + tc.Constraint_Name + ' PRIMARY KEY ' + ' (' + LEFT(j.List, Len(j.List)-1) + '); ' 
       END as 'SQL_CREATE_TABLE' 
    FROM sysobjects so 

    CROSS APPLY (
     SELECT 
       ' ['+column_name+'] ' 
       + data_type 
       + case data_type 
        when 'sql_variant' then '' 
        when 'text' then '' 
        when 'ntext' then '' 
        when 'decimal' then '(' + cast(numeric_precision as varchar) + ', ' + cast(numeric_scale as varchar) + ')' 
        else 
        coalesce(
        '('+ case when character_maximum_length = -1 
         then 'MAX' 
         else cast(character_maximum_length as varchar) end 
        + ')','') 
       end 
      + ' ' 
      + case when exists ( 
       SELECT id 
       FROM syscolumns 
       WHERE 
        object_name(id) = so.name 
        and name = column_name 
        and columnproperty(id,name,'IsIdentity') = 1 
      ) then 
       'IDENTITY(' + 
       cast(ident_seed(so.name) as varchar) + ',' + 
       cast(ident_incr(so.name) as varchar) + ')' 
       else '' 
       end 
      + ' ' 
      + (case when IS_NULLABLE = 'No' then 'NOT ' else '' end) 
      + 'NULL ' 
      + case when information_schema.columns.COLUMN_DEFAULT IS NOT NULL THEN 'DEFAULT '+ information_schema.columns.COLUMN_DEFAULT 
       ELSE '' 
       END 
      + ',' -- can't have a field name or we'll end up with XML 

     FROM information_schema.columns 
     WHERE table_name = so.name 
     ORDER BY ordinal_position 
     FOR XML PATH('') 
    ) o (list) 

    LEFT JOIN information_schema.table_constraints tc on 
     tc.Table_name = so.Name 
     AND tc.Constraint_Type = 'PRIMARY KEY' 

    LEFT JOIN information_schema.tables t on 
     t.Table_name = so.Name 

    CROSS APPLY (
     SELECT QuoteName(Column_Name) + ', ' 
     FROM information_schema.key_column_usage kcu 
     WHERE kcu.Constraint_Name = tc.Constraint_Name 
     ORDER BY ORDINAL_POSITION 
     FOR XML PATH('') 
    ) j (list) 

    WHERE 
     xtype = 'V' 
     AND name NOT IN ('dtproperties') 
     -- AND so.name = 'ASPStateTempSessions' 
    ; 

0

Si usted tiene acceso a SSIS, inserto un flujo de datos Para la fuente, use su vista. Para el destino, use la nueva tabla. La tabla completa se generará con columnas y tipos de datos. Si no desea transferir datos, puede dejarlos tal como están. Su tabla ya se habría creado al hacer clic en Sí para guardar su flujo de datos. Ahora, puede ir al SSMS y generar un script si desea ver los nombres de columna y los tipos de datos para la nueva tabla que acaba de generar.

2

Si lo tiene instalado, puede usar el Asistente de importación y exportación de SQL Server. Establezca su fuente y destino en el mismo servidor, la fuente es la vista, el destino es una nueva tabla. Esto tomará las definiciones de columna de la vista y creará una nueva tabla con esas definiciones.

El inconveniente obvio es que la nueva tabla tendrá los datos de la vista anterior, lo que podría ser un problema si tiene un gran número de filas como resultado de la vista. La forma más fácil alrededor de esto y crear una tabla en blanco con la definición de la vista es para seleccionar la opción "Escribir una consulta para especificar los datos para transferir" en el wizare y usar un código como éste:

SELECT * FROM YourView WHERE 1=2 

Como 1 no es igual a 2, no se devolverán filas, pero se conservará la definición de la columna y la nueva tabla se creará con esa definición.

Espero que ayude!

Cuestiones relacionadas