Blog Post

Azure Synapse Analytics Blog
3 MIN READ

Remotely run DDL and DML in Synapse from a SQL Managed Instance using Linked Servers

pedrorebelo's avatar
pedrorebelo
Icon for Microsoft rankMicrosoft
Mar 01, 2021

Imagine you have a SQL Managed Instance and a SQL Dedicated Pool. Now imagine that for some reason you need to run a SELECT, INSERT, UPDATE or even a CREATE TABLE on your SQL Dedicated Pool but executed from your SQL Managed Instance. In case you didn't know, you can do this using Linked Servers.

 

For those unfamiliar with Linked Servers, they enable the instance in which you create them to read data from remote data sources and also to execute commands against remote database servers.

 

You can setup Linked Servers using SSMS or you can use T-SQL as well. Here's a short example of how to setup a Linked Server from a SQL Managed Instance to Azure Synapse Analytics SQL Dedicated Pool, using T-SQL.

 

First, we need to start by creating the Linked Server on our SQL Managed Instance, and configuring it to point to our SQL Dedicated Pool:

 

 

-- Configure the linked server on your SQL Managed Instance
EXEC sp_addlinkedserver
  server = 'yourLinkedServer', -- specify here the name you want for your linked server
  @srvproduct = N'',
  Provider = 'MSOLEDBSQL', -- recommended OLE DB provider
  @datasrc='yourworkspacename.sql.azuresynapse.net', -- add here your SQL Dedicated Pool server name
  @catalog = 'yourDatabase'; -- add here your SQL Dedicated Pool database name as initial catalog (you cannot connect to the master database)

 

After having created the Linked Server, we need to define the credentials with which we want to connect to your SQL Dedicated Pool:

 

-- Add credentials and options to this linked server
EXEC sp_addlinkedsrvlogin
  @rmtsrvname = 'yourLinkedServer',
  @useself = 'false', -- so we can specify below which user and password to connect with
  @rmtuser = 'yourLogin', -- add here your login on your SQL Dedicated Pool
  @rmtpassword = 'yourPassword'; -- add here your password on your SQL Dedicated Pool

 

Lastly, by default Linked Servers are not able to make stored procedure calls so we need to enable a setting:

 

-- Enable RPC to the given server
EXEC sp_serveroption
  server = 'yourLinkedServer',
  @optname = 'rpc out', 
  @optvalue = true;

 

Once you've successfully executed all the previous steps, you can now remotely run T-SQL commands on your SQL Dedicated Pool directly from your SQL Managed Instance.

 

Executing T-SQL via Linked Servers requires we declare the objects we are referencing with a 4-part name in the format of:

 

-- Query the data using 4-part names 
SELECT * FROM yourLinkedServer.yourDatabase.yourSchemaname.yourTablename;

 

However, if you try to run DDL or DML (other than SELECT) using this 4-part name you'll get error messages as follows:

 

INSERT INTO yourLinkedServer.SampleSQL.dbo.Employee VALUES(1);

 

Msg 46706, Level 16, State 1, Line 29
Cursor support is not an implemented feature for SQL Server Parallel DataWarehousing TDS endpoint.

 

CREATE TABLE yourLinkedServer.SampleSQL.dbo.t1(col1 INT NULL);

 

Msg 117, Level 15, State 1, Line 31
The object name 'yourLinkedServer.SampleSQL.dbo.t1' contains more than the maximum number of prefixes. The maximum is 2.

A way to get around this is by running the DDL and DML in the format of:

 

EXEC ('DDL/DML') at yourLinkedServer

 

So for two previous examples, the T-SQL would be:

 

--to create a table
EXEC ('CREATE TABLE dbo.t1(col1 INT NULL)') at yourLinkedServer;

 

 

--to insert a row into the table
EXEC ('INSERT INTO dbo.t1 VALUES(1)') at yourLinkedServer;

 

 

Hope you find this useful!

Updated Feb 23, 2021
Version 1.0

3 Comments

  • Wenliang's avatar
    Wenliang
    Copper Contributor

    How to batch insert?

    EXEC ('INSERT INTO [database].[Schema].[table] (row1, row2) SELECT r1,r2 form [mylocalserver].[database].[Schema].[table]') AT [LinkedServerName]


    [mylocalserver].[database].[Schema].[table] doesn't exist LinkedServer

    How to batch insert the data of my local table into the table in linkserver

  • Hello ScottCurtis, thank you for your question.

    According to Microsoft's official documentation - https://docs.microsoft.com/en-us/sql/relational-databases/linked-servers/linked-servers-database-engine?view=sql-server-ver15 -  Linked Servers are not enabled in Azure SQL Database singleton and elastic pools: 

     

    Linked Servers originating from Synapse Dedicated Pool are also not enabled at the time of writing. You can check which are enabled in the "Applies to" section of the documentation:

  • ScottCurtis's avatar
    ScottCurtis
    Copper Contributor

    Is it possible to do this with Azure SQL Database or to originate the server link from Synapse Dedicated Pool?