I have an MXD. It connects to about 30 layers in one of our SDE databases. I want to change the SDE database they connect to.

Is there a way to do this without having to right-click every layer and change it individually?


Right click on the mxd in ArcCatalog, click on Set data sources, and bulk change from there. However, this tool warns:

Note: this dialog is intended primarily for preparing map documents for publication. Customizations (VBA code, UI Controls and custom toolbars), graphs, and table window appearance properties are removed from .mxd files when you update their data sources using this dialog. To preserve these, update the data sources in ArcMap instead.

You could also use the arcpy.mapping python library:

| improve this answer | |
  • This seems to not work in 10.1. The data source is changed, but (at least in the case of an SDE connection) the link is changed to a "database connection", i.e. the layer isn't being pointed to any longer, which breaks the link. – Michael Todd Sep 6 '12 at 15:28

If you are using ArcGIS 10 and are interested in using Python, check out the help on Updating and fixing data sources with arcpy.mapping and the methods of the Layer object.


import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project_SDE1.mxd")
mxd.findAndReplaceWorkspacePaths(r"Database Connections\Connection to GISSDE1.sde", 
                                r"Database Connections\Connection to GISSDE2.sde")
del mxd

If your layers don't all source the same original connection file, or the destination feature class name is different on the new SDE, you might need to use Layer.replaceDataSource instead.

| improve this answer | |
  • This works perfectly thanks! One thing to add is "Database Connections\Connection to GISSDE1.sde" can be replaced with a .gdb location too. – Jack Fairfield Jan 4 '17 at 19:41
  • How would I be able to use this from switching the data source from the SAME SDE but from version 1 to version 2? – NULL.Dude Apr 6 '17 at 12:32
  1. Make a data source connection in ArcCatalog.
  2. Open the MXD and expand the layer and click on the red exclamation mark in any layer. This will open a popup window containing the data source with database connection.
  3. Select the database connection that you had made, double-click on that and go inside that to the layer that you have clicked and select that layer and press OK, Open or Add.

This will remove all the red exclamation mark containing layers in the MXD and will point to the new created data source. In one go you can do this; no need to go and click each time on the red exclamation mark and clicking and setting the data source.

| improve this answer | |
  • Its very helpfull.Please go throug this once – Inderjeet singh bhambra Dec 20 '12 at 6:13
  • 3
    This will only work if the connections are broken, otherwise one of the other answers are more appropriate. – blah238 Dec 20 '12 at 6:29


The link is to an old Arcscript called GDK tools, wich can be obtained on other sites. The Program creates a toolbar in arcmap where you can change source on selected layers (any layer you want. this works between SDE connections or SDE to local file geodatabase (wich change source in Arccatalog not can handle, because of the name in SDE starts with the SDE user and then dot.

this is very helpful, but maybe only in arcgis 9.3

| improve this answer | |
  • 1
    While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. – BradHards Feb 14 '14 at 10:01
  • I Have modified! – jonaktiv Feb 14 '14 at 12:57

If you've got the .mxd open already, do what @blah238 did, but use 'CURRENT' instead of the full path. Don't forget that the search and replace doesn't have to be the full string:

import arcpy
mxd = arcpy.mapping.MapDocument('CURRENT')

Then you'll have to save and reopen the .mxd file anyway.

| improve this answer | |

For one mxd, default ESRI tools can suffice. But fixing multiple mxds with broken links can be a nightmare. Try my UpdateLayerRefs tool to fix unlimited MXDs in seconds: https://github.com/jswagger/UpdateLayerRefs Just provide the names of your input MXD's as a list ["Name1.mxd", "Name2.mxd", "Name3.mxd"]

| improve this answer | |
  • Nice sharing your code :) Can you elaborate a bit on how one can use it ? – gisnside Aug 28 '17 at 17:27
  • Absolutely: 1. Fill out JSON config file: – Jeremy Swagger Aug 29 '17 at 20:46
  • First step, i guessed ! But i'm wondering about after - Seems your comment didn't hit the ground for the rest of the message. You should maybe edit your answer instead :) :) – gisnside Aug 29 '17 at 20:53
  • 1
    Sorry, got pulled off on something. Updating the readme file now.... – Jeremy Swagger Aug 29 '17 at 21:06
  • 1
    That is correct. Running python UpdateLayerRefs.py --config "update_layer_refs.config.json" allows you to run it in any folder. – Jeremy Swagger Aug 29 '17 at 21:20

Seems like this post is old, but i can't get this to work: Code is as follows:

import arcpy, glob

#specify MXD location to change source data
mxd = arcpy.mapping.MapDocument(r"C:\\Users\\jrender\\Documents\\LandbaseEditing PreProd Pub Check.mxd")
workspaceCurrent = r"Database Connections\Connection to PP_GISLand_Landbase.sde"
workspaceTarget = r"Database Connections\Connection to PP_Publication_GISLand.sde" 

mxd.findAndReplaceWorkspacePaths(workspaceCurrent, workspaceTarget)

#save a new copy of MXD
mxd.saveACopy(r"C:\Users\jrender\Documents\LandbaseEditing PreProd Pub Check Repathed.mxd")
| improve this answer | |
  • Welcome to GIS SE. If you have not done so, please take the tour to learn about this Q&A format. Your answer may be best re-posted as a question of its own. Be sure to include any error messages you received when you ran the code! – Andy Oct 11 '18 at 17:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.