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?
Répondre
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.
C'est la structure de la table que je veux reproduire, pas les données. –
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. –
Je suis confus, dites-vous que je dois créer la table manuellement? –
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.
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'
;
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.
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!
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 ... –
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
@djacobson, je commence à penser que tu as raison. Postez-le comme une réponse et je vais accepter. –