11
votes

Générer automatiquement un type de table défini par l'utilisateur qui correspond à une table existante

J'ai plusieurs tables existantes dans ma base de données. Certains d'entre eux ont plusieurs colonnes.

Je veux faire des procédures stockées pour faire une déclaration de fusion avec ces tables. Pour ce faire, je voudrais que le paramètre de la procédure stockée soit un type de table défini par l'utilisateur.

Je peux faire sortir chaque table et le modifier à une instruction de création de type de table définie par l'utilisateur.

mais ce que j'aimerais vraiment, c'est un moyen de générer un type de table défini par l'utilisateur éteint une table existante dans ma base de données. je pourrais ajouter ce script à ma base de données (puis ajoutant de nouvelles colonnes à une table n'a pas besoin de plus d'une édition).

Y a-t-il un moyen de faire ça? Ou devrais-je simplement être occupé à scripter mes tables?


2 commentaires

Il existe des procédures stockées du système, par ex. sp_columns , cela vous permettra de tirer toutes les métadonnées. Vous pouvez le masser et utiliser SQL dynamique pour créer vos tables clonées. Je suppose que vous avez réfléchi à l'utilisation de SELECT * dans une nouvelle carte de l'OUTAGEAble où 42 = 13 Pour créer une nouvelle table vide avec la même structure qu'une table existante, mais pas de lignes.


@ user92546 - A Tableau et a Type de table défini par l'utilisateur ne sont pas la même chose.


3 Réponses :


3
votes

Dans SQL Server Management Studio, vous pouvez cliquer avec le bouton droit de la souris sur une base de données et, sous Tâches, choisissez de scripter la base de données. Choisissez des tables uniquement, puis les tables qui vous intéressent.

Cela ne vous donne pas une boutique unique à ce que vous voulez, mais cela peut script de nombreuses tables rapidement et facilement. Puis vous permettre de faire un peu de trouver et de remplacer pour obtenir ce dont vous avez besoin.


0 commentaires

1
votes

Je ne savais pas qu'il y avait un assistant pour générer des scripts de base de données comme celui Dems parle dans sa réponse. Et il semble une méthode plus universelle que celle que je l'ai utilisé, parce que l'assistant vous permet de générer des scripts pour différents types d'objets en une seule fois.

Pourtant, je crois que je vais partager le mien, car il me semble un peu plus simple et est très pratique lorsque vous avez seulement besoin d'objets de même type de script, comme les tables seulement.

Alors, va ici (en particulier pour les tables):

  1. Ouvrir l'Explorateur d'objets ( F8 ) et le connecter à l'instance du serveur cible.

  2. Agrandir Bases de données élément.

  3. Développez l'élément avec le nom de votre base de données.

  4. Cliquez Tables .

  5. Ouvrir l'Explorateur d'objets Détails ( F7 ). Il devrait maintenant afficher la liste des tables utilisateur.

  6. En utilisant des méthodes standard de Windows de sélectionner plusieurs objets (comme Ctrl + clic), sélectionnez les tables que vous souhaitez script.

  7. Faites un clic droit sur l'un des éléments sélectionnés et choisissez Tableau Script comme ▸ , puis choisissez le type de script et où l'enregistrer.

    Lorsque vous avez besoin de scripts différents types d'objets, passez à un autre Explorateur d'objets « dossier » au lieu de Tables , par exemple pour les procédures stockées, il serait programmabilité \ Procédures stockées .


0 commentaires

5
votes

J'ai besoin de la même chose de temps en temps. Voici un petit script que j'ai mis ensemble. C'est un peu rude et je ne ferais pas confiance avec ma vie, mais cela fonctionne assez bien pour mon cas. Ce n'est pas des clés de script, mais pour mon scénario qui n'est pas nécessaire. Je suis sur SQL 2012 cependant, donc je ne suis pas totalement sûr que cela fonctionnera tel que sur SQL 2008. Je ne l'ai pas testé pour certains des types les plus «exotiques» tels que géométrie code>, Géographie code> et amis, car je n'ai jamais eu besoin de les utiliser.

declare
    @tablename nvarchar(50)='Users',
    @schemaname nvarchar(50)='dbo',
    @sql nvarchar(max)=N'';

select @sql += N',' + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'[' + c.COLUMN_NAME + N'] [' + DATA_TYPE + N']'
    + case when c.CHARACTER_MAXIMUM_LENGTH is not null then N'(' + case c.CHARACTER_MAXIMUM_LENGTH when -1 then 'max' else cast(c.CHARACTER_MAXIMUM_LENGTH as nvarchar(10)) end + N')' else N'' end
    + case when c.DATA_TYPE = N'numeric' then N'('+CAST(NUMERIC_PRECISION as nvarchar(10))+N', '+CAST(NUMERIC_SCALE as nvarchar(10))+N')' else N'' end
    + case when c.is_nullable <> N'NO' then N' NULL' else N' NOT NULL'end
from INFORMATION_SCHEMA.COLUMNS c
where TABLE_NAME = @tablename AND TABLE_SCHEMA = @schemaname
order by ORDINAL_POSITION;

set @sql = stuff(@sql, 1, 1, N'CREATE TYPE [' + @schemaname + N'].[tab_' + @tablename + N'] AS TABLE(')
    + nchar(13) + nchar(10) + ')' + nchar(13) + nchar(10) + 'GO';
set @sql += nchar(13) + nchar(10) + '--GRANT EXEC ON TYPE::[' + @schemaname + N'].[tab_' + @tablename + N'] TO [User];'
    + nchar(13) + nchar(10) + '--GO';

print @sql
-- If you're happy with the sql, you can pass it to sp_executesql to create your type
-- exec sp_executesql @sql;


0 commentaires