2009-04-01 4 views
8

J'ai une longue liste de SP (procédure stockée) et de fonctions dans mon serveur SQL db. Je pourrais les enregistrer un par un en cliquant droit et le script XXX à Alter To. Est-il possible dans TSQL d'interroger tous les SP et les fonctions les enregistrer dans des fichiers xxx.sql? Par exemple, pour sp_mySP1, je voudrais l'enregistrer dans sp_mySP1.sql qui est un fichier texte. Par exemple, pour sp_mySP1, je voudrais l'enregistrer dans sp_mySP1.sql. La base de données est trop grande et je voudrais sauvegarder seulement les SP et les fonctions comme une sauvegarde des codes source.moyen rapide pour sauvegarder SQL SP et fonctions?

+0

J'ai une fonction SaveToFile (xml, nom de fichier) pour enregistrer xml dans un fichier. Vous ne savez pas si je peux utiliser cette fonction pour passer des SP en XML dans un fichier? –

Répondre

18

En studio de gestion; trouver la base de données, cliquez avec le bouton droit, tâches, générer des scripts;

prochain-suivant jusqu'à ce que vous "Choisissez les types d'objet". Sélectionnez "Procédures stockées" et "Fonctions définies par l'utilisateur", ensuite, Sélectionner tout; choisissez une sortie; aller!

+0

Super! Il fonctionne comme un charme. La seule chose est que les données ne sont pas scriptées, je veux dire des scripts d'insertion. S'il y avait l'option faire cela pour certaines tables de petite taille, ce serait génial. –

+1

Eh bien, vous avez demandé des SP et des fonctions. Pour les données Tâches -> Exporter des données –

+0

Vous pouvez scripter des données avec des tables ... Dans l'écran Générer des options de scripts, définissez l'option 'Données de script' sur Vrai. –

0

Vous pouvez interroger syscomments pour obtenir votre texte de création d'objet sql, mais je ne sais pas comment les enregistrer tous dans des fichiers séparés en utilisant uniquement TSQL.

select * from syscomments 
+0

Intéressant. Je suppose que la colonne de texte est pour les codes source. C'est comme une longue longue ligne. De toute façon pour trouver le nom de l'id pour sp ou nom de la fonction? –

+0

Vous pouvez rejoindre avec sysobjects. Je suppose que vous pouvez comprendre comment les joindre, car je n'ai pas d'environnement pratique. –

+0

select * from sysobjects –

4

1) Faites un clic droit sur le nom de votre base de données dans l'Explorateur d'objets

2) Sélectionnez "Tâches> Générer des scripts ..." dans le menu contextuel

3) Sélectionnez votre base de données la liste et cliquez sur Suivant

4) Cliquez sur Suivant les options de script AVONS CHOISI

5) Dans les types d'objets, vérifier les procédures stockées et les fonctions définies par l'utilisateur, cliquez sur Suivant

6) Cliquez sur Sélectionner tout sur les procédures stockées écran de sélection, cliquez sur Suivant

7) Cliquez sur Sélectionner tout sur l'écran de sélection des fonctions, cliquez sur Suivant

8) Sélectionnez « Script à Nouvelle requête Fenêtre » et cliquez sur Terminer

3

Voici un proc qui exportera QUELQUES types de données.

if exists (select * from sysobjects where name = 'ExportData_P') 
    drop proc ExportData_P 
go 

CREATE PROC dbo.ExportData_P ( 
    @tableName varchar(500), 
    @where varchar(5000) = '(1=1)' 
) 
AS 
BEGIN 
    SET NOCOUNT ON 

    DECLARE @sql varchar(8000) 
    DECLARE @fieldList varchar(8000) 
    DECLARE @valueList varchar(8000) 
    SELECT @fieldList = '', @valueList = '' 

    DECLARE @cols TABLE (column_name nvarchar(250), data_type varchar(250)) 
    DECLARE @c nvarchar(250), @data_type varchar(250) 

    INSERT INTO @cols 
    select column_name, data_type 
    from information_Schema.columns 
    where table_name = @tableName 


    WHILE EXISTS (SELECT TOP 1 * FROM @cols) 
    BEGIN 
     SELECT TOP 1 @c = column_name, @data_type = data_type FROM @cols 


     SELECT 
     @fieldList = @fieldList + @c + ', ', 
     @valueList = @valueList + CHAR(13) + 'case when ' + @c + ' is null then ''NULL'' else '''''''' + ' + 
      case when @data_type in ('text','ntext','char', 'nvarchar', 'varchar') then 
       ' REPLACE (REPLACE (REPLACE (' 
       else '' 
      end + 
      'IsNull (convert(varchar' + 
      (-- change this section to pass the length of varchar to convert 
       case when @data_type in ('uniqueidentifier') then '(50)' 
        when @data_type in ('text', 'ntext') then '(8000)' 
       else '' end 
      ) + 
      ', ' + 
      @c + 
      '), '''')' + -- end is null 
      case when @data_type in ('text','ntext','char', 'nvarchar', 'varchar') then 
       ', CHAR(39), CHAR(39)+CHAR(39)), CHAR(13), '''' + CHAR(13) + ''''), CHAR(9), '''' + CHAR(9) + '''') ' 
       else '' 
      end + 
      ' + '''''''' end + '', '' + ' 

     DELETE FROM @cols WHERE column_name = @c 
    END 

    SELECT @fieldList = LEFT (@fieldList, LEN(@fieldList)-1), 
     @valueList = LEFT (@valueList, LEN(@valueList)-1) 

    SELECT @sql = 'select ''insert into ' + @tableName + ' (' + @fieldList + ') ' + 
     ' VALUES (''+ ' + left (@valueList, len(@valueList)-5) + ''') '' from ' + @tableName + 
     ' WHERE ' + @where 

    -- into [#mcoe_temp_export' + @tableName + '] 
    print @sql 
    EXEC (@sql) 
    --EXEC ('select * from [#mcoe_temp_export' + @tableName + ']')   

    SET NOCOUNT OFF 
END 

go 

utilisation comme:

exec ExportData_P 'tablename' 
+0

comment obtenir une liste de noms de table? Ensuite, j'utilise votre SP pour faire une boucle ... –

+1

select top 10 * à partir de sysobjects où xtype = 'U' – Jamie

Questions connexes