2010-12-08 3 views
5

Sous les options "Script vers", vous pouvez choisir de créer comme script ce que vous voulez. Est-il possible d'obtenir une structure de table correspondante pour une vue en utilisant une méthode similaire?Est-il possible de scripter une vue en tant que table dans SQL Server?

+1

Vous voulez générer une instruction CREATE TABLE en fonction des colonnes sélectionnées dans la définition d'une vue? Pas aussi loin que je sache ... –

+0

Cette question m'a fait penser à http://stackoverflow.com/questions/21547/in-sql-server-how-do-i-generate-a-create-table-statement -pour une table donnée, ce qui peut ou peut ne pas vous aider. – Justin

+0

@djacobson, je commence à penser que tu as raison. Postez-le comme une réponse et je vais accepter. –

Répondre

28

Vous pouvez faire SELECT INTO depuis la vue à une nouvelle table, puis le script. Peut-être sauver un peu de frappe si c'est la motivation pour la question.

+0

C'est la structure de la table que je veux reproduire, pas les données. –

+1

C'est pourquoi aucune donnée n'a été insérée! Une fois la nouvelle table existante, vous pouvez utiliser la fonctionnalité standard de SSMS pour le script. –

+0

Je suis confus, dites-vous que je dois créer la table manuellement? –

2

Si vous voulez générer une instruction CREATE TABLE en fonction des colonnes sélectionnées dans la définition d'une vue, je ne connais aucun moyen de le faire sans étapes intermédiaires, telles que suggérées par @Martin.

7

Voici ce que nous utilisons pour le faire.

Tout le crédit pour la passe ci-dessous au poste haut here et @Zanlok dont la version révisée et je l'ai utilisé pour regarder des règlements ultérieurs vues plutôt que des tables:



    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 vous avez accès à SSIS, insérer un flux de données. Pour la source, utilisez votre vue. Pour la destination, utilisez la nouvelle table. La table entière sera générée avec la colonne et les types de données. Si vous ne voulez pas transférer de données, vous pouvez le laisser tel quel. Votre table aurait déjà été créée lorsque vous cliqueriez sur Oui pour enregistrer votre flux de données. Maintenant, vous pouvez aller au SSMS et générer un script si vous souhaitez voir les noms de colonnes et les types de données pour la nouvelle table que vous venez de générer.

2

Si vous l'avez installé, vous pouvez utiliser l'Assistant Importation et exportation de SQL Server. Définissez votre source et votre destination sur le même serveur, la source étant la vue, la destination étant une nouvelle table. Cela prendra les définitions de colonnes de la vue et créera une nouvelle table avec ces définitions. L'inconvénient évident est que la nouvelle table aura les données de l'ancienne vue, ce qui pourrait être un problème si vous avez un grand nombre de lignes à la suite de la vue. La meilleure façon de contourner cela et de créer une table vide avec la définition de la vue est de sélectionner l'option « Ecrire une requête pour spécifier les données à transférer » dans le wizare et utiliser un code comme ceci:

SELECT * FROM YourView WHERE 1=2 

Puisque 1 n'est pas égal à 2, aucune ligne ne sera retournée, mais la définition de la colonne sera conservée et la nouvelle table sera créée avec cette définition.

Espérons que ça aide!

Questions connexes