2

I use SQL Server 2012 and SQL Server 2008 R2.

I create a script from all object (tables / trigger / stored procedure / function ...) in my database.

I generated this script from SQL Server Management Studio. I can recreate my database with this scrips on the other server. But I miss all diagrams of my database after run my script for create another database.

Therefore, I need create backup script from all diagrams that exist in my database.

I need execute this script on the destination database for recreating all my diagrams.

I found this Link. but i need some thinks that create all script (Insert Command) automatically.

Ardalan Shahgholi
  • 11,967
  • 21
  • 108
  • 144

3 Answers3

8

I have found a reasonable solution. The problem is that Management Studio cannot display more that 65535 characters for Non-XML data, and cannot be set to display more than 65535.

See code for documentation :)

Backup script:

-- 1. Read from DB, using XML to workaround the 65535 character limit
declare @definition varbinary(max)
select @definition = definition from dbo.sysdiagrams where name = 'ReportingDBDiagram' 

select
    '0x' + cast('' as xml).value('xs:hexBinary(sql:variable("@definition") )', 'varchar(max)')
for xml path('')

-- 2. Open the result XML in Management Studio
-- 3. Copy the result
-- 4. Paste this in backup script for @definition variable

Restore script:

declare @definition varbinary(max)
set @definition = 0xD0CF -- Paste 0x0 value from Backup script

-- Create diagram using 'official' Stored Procedure
exec dbo.sp_creatediagram
    @diagramname = 'ReportingDBDiagramCopy',
    @owner_id = null,
    @version = 1,
    @definition = @definition
KoalaBear
  • 2,755
  • 2
  • 25
  • 29
2

Scripting your database does not include diagrams as they are not server objects in the same way as a table or stored procedure; they exist as data in the sysdiagrams table.

A similar question on SO asked How do you migrate SQL Server Database Diagrams to another Database?

The accepted answer is to copy the contents of the sysdiagrams table to the new database, so you could include the table contents in your script. The answer with the most up-votes has a link to a way of scripting diagrams.

I've tried backing up and then restoring a database to the same server, deleting the diagram I had created (I only had one) and then running the following query:

INSERT  INTO database2.dbo.sysdiagrams
        ( 
         NAME
        ,principal_id
        ,version
        ,DEFINITION
        )
        SELECT  NAME
               ,principal_id
               ,version
               ,DEFINITION
        FROM    database1.dbo.sysdiagrams 

The diagram was successfully restored, however I did do this on a restored backup, I should really test it with a new database generated from a script.

UPDATE:

I scripted a database and then created a new database from it. When trying to rebuild the diagrams using an INSERT statement I got the error

enter image description here

So although it seems possible it's not trivial to create diagrams in a new database created from a script. Go with the answer given regarding scripting diagrams and modify it for your own needs.

Perhaps you can investigate further and post your own answer :)

Community
  • 1
  • 1
Tony
  • 9,672
  • 3
  • 47
  • 75
  • 1
    +1: Scripting database diagrams to a script/text file before running seems to hit some sort of file limits and gives the "docfile has been corrupted". Copying it directly, using a cross database `insert` like yours seems to work 100% of the time. When I get time I will see if it is just the line length limit. – iCollect.it Ltd Jan 08 '14 at 15:15
1

Here's a quick & dirty method I use. Since the query window won't display the full varbinary(max) value of the definition field, but the XML editor will, I output the rows to XML as follows:

  1. Run the following query on the server/database that contains the diagrams:

    SELECT 'INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('''+name+''','
    +CONVERT(varchar(2),principal_id)+','+CONVERT(varchar(2),diagram_id)+','+CONVERT(varchar(2),version)+','
    +'0x' + CAST('' as xml).value('xs:hexBinary(sql:column("definition"))','varchar(max)') +')'
    FROM RCSQL_ClaimStatus.dbo.sysdiagrams
    FOR XML PATH
    
  2. Click on the generated link to open the XML result, and ctrl-a & ctrl-c to copy all rows generated.

  3. Paste that output back into your query window. I usually paste it between a pair of IDENTITY_INSERT's like this:

    --TRUNCATE TABLE sysdiagrams
    SET IDENTITY_INSERT sysdiagrams ON;
    <row>INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('ERD1',1,1,1,0xD0CF11E0A1B11AE100000...)</row>
    <row>INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('ERD2',1,2,1,0xD0CF11E0A1B11AE100000...)</row>
    <row>INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('ERD3',1,3,1,0xD0CF11E0A1B11AE100000...)</row>
    SET IDENTITY_INSERT sysdiagrams OFF;
    
  4. Remove the row & /row XML tags from your inserts, and run them on the target server. You can truncate the sysdiagrams table if you're replacing all values with new values.

SQLDude
  • 11
  • 1