Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6935877
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 27, 20262026-05-27T12:09:39+00:00 2026-05-27T12:09:39+00:00

I need to extract a sizeable amount of data (> 1000 pages) from a

  • 0

I need to extract a sizeable amount of data (> 1000 pages) from a Microsoft Content Management Server (MCMS) database for use in a Sitecore website.

I can see two main options:

  1. Migrate the data into a new simplified database and display that
    information in the new website.

  2. Convert the MCMS solution to SharePoint and use the SharePoint
    connector module available for Sitecore to display this information.

I would prefer to go down the first route as there are no plans to use SharePoint to manage data/content in the future and would prefer to store this information in a simple SQL Server database to allow better searching.

I’ve looked at the database in question and think that the main tables I’d be interested in are Node, NodePlaceholder and NodePlaceholderContent but am struggling to find what I would expect. Can anyone out there give a bit of an explanation about the schema of this database for me? Or am I going to have problems trying to migrate the data in this way?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-27T12:09:40+00:00Added an answer on May 27, 2026 at 12:09 pm

    I’ve just recently been going through a similar process of exporting content pages out of MCMS 2002 (migrating to WordPress).

    I’m not saying this is the 100% correct way to get the data but it worked for me.

    Here’s the process I’ve taken to get page content out of the database.

    As you’ve already seen the tables storing most of the data are Node and NodePlaceholderContent

    1.) To get an idea of what the Node table holds you can view the contents organized by type

    SELECT
        [Type]
        ,CASE [Type] 
            WHEN      1 THEN 'Server'
            WHEN      4 THEN 'Channel'
            WHEN     16 THEN 'Post/Page'
            WHEN     64 THEN 'Resource Gallery'
            WHEN    256 THEN 'Resource Gallery Item (images/documents)'
            WHEN  16384 THEN 'Template Gallery'
            WHEN  65536 THEN 'Template' END as [Description]
        ,COUNT([Type]) as [Count]
    FROM        dbo.Node
    GROUP BY    [Type]
    ORDER BY    [Count] DESC
    

    2.) Pages (and Posts, will cover Posts further down) are type = 16…but to get just pages (and not posts) we need to filter by IsShortcut = 0

    SELECT * FROM dbo.Node WHERE [Type] = 16 AND IsShortcut = 0
    

    3.) I only wanted published pages, so filter by ApprovalStatus = 1

    -- Get all published pages
    SELECT * 
    FROM dbo.Node WHERE [Type] = 16 
    AND IsShortcut = 0
    AND ApprovalStatus = 1 
    

    4.) Next, determine page created/modified by (with usernames)

    -- Get published pages & author/editor
    SELECT 
        [page].Id
        ,[page].NodeGuid
        ,[page].Name
        ,[created].Username as 'CreatedBy'
        ,[page].CreatedWhen
        ,[modified].Username as 'ModifiedBy'
        ,[page].ModifiedWhen
    FROM        dbo.Node [page]
    -- add JOIN on created by user
    INNER JOIN  dbo.ClientAccount [created] ON [created].UserId = [page].CreatedByUserId
    -- add JOIN on modified by user
    INNER JOIN  dbo.ClientAccount [modified] ON [modified].UserId = [page].ModifiedByUserId
    WHERE [Type] = 16 
    AND IsShortcut = 0
    AND ApprovalStatus = 1 
    

    5.) Next, figure out where in the hierarchy we are by using the Node.ParentGUID column

    SELECT 
        [page].Id
        ,[page].NodeGuid
        ,[page].Name
        ,[pageParent].Name -- add page parent Name
        ,[created].Username as 'CreatedBy'
        ,[page].CreatedWhen
        ,[modified].Username as 'ModifiedBy'
        ,[page].ModifiedWhen
    FROM        dbo.Node [page]
    INNER JOIN  dbo.ClientAccount [created] ON [created].UserId = [page].CreatedByUserId
    INNER JOIN  dbo.ClientAccount [modified] ON [modified].UserId = [page].ModifiedByUserId
    -- add JOIN on Node using ParentGUID
    INNER JOIN  dbo.Node [pageParent] ON [pageParent].NodeGUID = [page].ParentGUID
    WHERE [page].[Type] = 16
    AND [page].IsShortcut = 0
    AND [page].ApprovalStatus = 1 
    

    This query let me know that pages are either in parent nodes named Folders or Archive Folder

    6.) Go up another level (get parent of parent)

    SELECT 
        [page].Id
        ,[page].NodeGuid
        ,[page].Name
        ,[pageParent].Name 
        ,[pageParent2].Name -- add parent of parent name
        ,[created].Username as 'CreatedBy'
        ,[page].CreatedWhen
        ,[modified].Username as 'ModifiedBy'
        ,[page].ModifiedWhen
    FROM        dbo.Node [page]
    INNER JOIN  dbo.ClientAccount [created] ON [created].UserId = [page].CreatedByUserId
    INNER JOIN  dbo.ClientAccount [modified] ON [modified].UserId = [page].ModifiedByUserId
    INNER JOIN  dbo.Node [pageParent] ON [pageParent].NodeGUID = [page].ParentGUID
    -- add another JOIN on Node using ParentGUID (parent of parent)
    INNER JOIN  dbo.Node [pageParent2] ON [pageParent2].NodeGUID = [pageParent].ParentGUID
    WHERE [page].[Type] = 16
    AND [page].IsShortcut = 0
    AND [page].ApprovalStatus = 1 
    

    The parent of parent is Server (the root level) so now my conclusion is if the page’s parent is:

    • Folders – then that’s an active page
    • Archive Folder – then that’s a previous revision of another page

    I only want active pages so I’m going to JOIN on the Folders parent only

    7.) Now how about the markup. In our MCMS template there was only had one placeholder area. The NodePlaceholder table will identify the name of the placeholder(s) which is helpful if you have multiple placeholder areas in your template. I’m only going to join on NodePlaceholdercontent for simplicity.

    SELECT 
        [page].Id
        ,[page].NodeGuid
        ,[page].Name
        /* remove parent names */
        ,[created].Username as 'CreatedBy'
        ,[page].CreatedWhen
        ,[modified].Username as 'ModifiedBy'
        ,[page].ModifiedWhen
        ,html.PropValue as 'HTML' -- add the markup
    FROM        dbo.Node [page]
    INNER JOIN  dbo.ClientAccount [created] ON [created].UserId = [page].CreatedByUserId
    INNER JOIN  dbo.ClientAccount [modified] ON [modified].UserId = [page].ModifiedByUserId
    -- change alias to "folders"
    INNER JOIN  dbo.Node [folders] ON [folders].NodeGUID = [page].ParentGUID AND [folders].Name = 'Folders'
    -- join on PlaceholderContent to get the HTML
    -- this table will also have references to any static files contained in the page (such as images) so we filter those out by PropName = 'HTML'
    INNER JOIN  dbo.NodePlaceholderContent html ON html.NodeId = [page].Id AND html.PropName = 'HTML' 
    WHERE [page].[Type] = 16
    AND [page].IsShortcut = 0
    AND [page].ApprovalStatus = 1 
    

    8.) So at this point I got a little stuck on trying to determine where the page is in the system (ie. relative path or what channel does it live in), going back to step 1 & 2, type = 16 can be either a post or a page (which aren’t the same thing but they are related). So now we JOIN our pages to the post records to determine pathing.

    After some google searches I stumbled upon this excerpt from Microsoft Content Management Server 2002: a complete guide really helped to get the rest of the way (and identified the Node.Type enums)

    SELECT 
        [page].Id
        ,[page].NodeGuid
        ,[page].Name
        ,[post].DisplayName as 'Title' -- add page Title from the post record
        ,[pageParent].Name 
        ,[pageParent2].Name
        ,[created].Username as 'CreatedBy'
        ,[page].CreatedWhen
        ,[modified].Username as 'ModifiedBy'
        ,[page].ModifiedWhen
        ,html.PropValue as 'HTML'
    FROM        dbo.Node [page]
    INNER JOIN  dbo.ClientAccount [created] ON [created].UserId = [page].CreatedByUserId
    INNER JOIN  dbo.ClientAccount [modified] ON [modified].UserId = [page].ModifiedByUserId
    INNER JOIN  dbo.Node [folders] ON [folders].NodeGUID = [page].ParentGUID AND [folders].Name = 'Folders'
    INNER JOIN  dbo.NodePlaceholderContent html ON html.NodeId = [page].Id AND html.PropName = 'HTML' 
    -- join using followGUID to get the posting
    INNER JOIN  dbo.Node [post] ON [post].FollowGUID = [page].NodeGUID
    WHERE [page].[Type] = 16
    AND [page].IsShortcut = 0
    AND [page].ApprovalStatus = 1 
    

    9.) The final step now is to keep going up the post parent hierarchy resulting in several LEFT JOINS stepping up the ParentGUID chain. This query gives a visual representation of hierarchy using these LEFT JOINS.

    SELECT 
        CASE WHEN postParent9.Name IS NULL THEN '' ELSE postParent9.Name + ' > ' END +
        CASE WHEN postParent8.Name IS NULL THEN '' ELSE postParent8.Name + ' > ' END +
        CASE WHEN postParent7.Name IS NULL THEN '' ELSE postParent7.Name + ' > ' END +
        CASE WHEN postParent6.Name IS NULL THEN '' ELSE postParent6.Name + ' > ' END +
        CASE WHEN postParent5.Name IS NULL THEN '' ELSE postParent5.Name + ' > ' END +
        CASE WHEN postParent4.Name IS NULL THEN '' ELSE postParent4.Name + ' > ' END +
        CASE WHEN postParent3.Name IS NULL THEN '' ELSE postParent3.Name + ' > ' END +
        CASE WHEN postParent2.Name IS NULL THEN '' ELSE postParent2.Name + ' > ' END +
        CASE WHEN postParent1.Name IS NULL THEN '' ELSE postParent1.Name + ' > ' END +
        page.Name as [Path]
        ,page.Name + '.htm' as [PageName]
        ,post.DisplayName as [PageTitle]
        ,CASE page.[Type] 
            WHEN      1 THEN 'Server'
            WHEN      4 THEN 'Channel'
            WHEN     16 THEN 'Post/Page'
            WHEN     64 THEN 'Resource Gallery'
            WHEN    256 THEN 'Resource Gallery Item (images/documents)'
            WHEN  16384 THEN 'Template Gallery'
            WHEN  65536 THEN 'Template' END as [Type]
        ,page.CreatedWhen as 'Created'
        ,page.ModifiedWhen as 'Modified'
        ,html.PropValue as 'HTML'
    FROM        dbo.Node page
    INNER JOIN  dbo.Node folders ON folders.NodeGUID = page.ParentGUID AND folders.Name = 'Folders'
    INNER JOIN  dbo.NodePlaceholderContent html ON html.NodeId = page.Id AND html.PropName = 'HTML'
    INNER JOIN  dbo.Node post ON post.FollowGUID = page.NodeGUID AND post.IsShortcut = 1
    LEFT JOIN   dbo.Node postParent1 ON postParent1.NodeGuid = post.ParentGUID
    LEFT JOIN   dbo.Node postParent2 ON postParent2.NodeGuid = postParent1.ParentGUID
    LEFT JOIN   dbo.Node postParent3 ON postParent3.NodeGuid = postParent2.ParentGUID
    LEFT JOIN   dbo.Node postParent4 ON postParent4.NodeGuid = postParent3.ParentGUID
    LEFT JOIN   dbo.Node postParent5 ON postParent5.NodeGuid = postParent4.ParentGUID
    LEFT JOIN   dbo.Node postParent6 ON postParent6.NodeGuid = postParent5.ParentGUID
    LEFT JOIN   dbo.Node postParent7 ON postParent7.NodeGuid = postParent6.ParentGUID
    LEFT JOIN   dbo.Node postParent8 ON postParent8.NodeGuid = postParent7.ParentGUID
    LEFT JOIN   dbo.Node postParent9 ON postParent9.NodeGuid = postParent8.ParentGUID
    

    As an aside, my task didn’t involve exporting the resource gallery content (images/docs/etc) but there should be enough information here to get a good start on that if you do require those pieces as well.

    I hope this can be of some help to someone else migrating from MCMS 2002…

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I need to extract data from my MySQL database into multiple text files. I
I need to extract data from .CDB (CardScan Database) using C#. How i can
I need to extract some management information (MI) from data which is updated in
I need to extract data from a .mpp file on the network and combine
I need to extract all the images from a PDF file on my server.
I need extract data from a string. Heres an example: Mozilla/5.0 (Macintosh; U; PPC
I need to extract some information from not very complicated HTML pages in web.
I need to extract a table of data on a collection of pages. I
I need to extract records from a table, copy the data to a second
I need to extract data from a DB2 table, run some processing on each

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.