SQL Server Linked Servers feature allows you to query data from other databases (even non SQL Server databases) from within SQL Server.
While I believe large data transfer jobs are best handled using an ETL solution like SSIS, sometimes all you want is a just a couple hundred rows of data from another database and setting up an ETL jobs might be overkill.
In this example, I am going to set up a link to a Teradata Data Warehouse. This will allow me to query data from the warehouse and use it in my SQL Server environment.
(Note that you can connect to any database, such as another SQL Server or Oracle. I am just using Teradata as an example)
First go into SSMS and connect to your SQL Server
Now, in Object Explorer go to Server Objects -> Linked Servers
Right click on Linked Servers and select New Linked Server…
For a Teradata connection, I am choosing Microsoft OLE DB Provider for ODBC Drivers
(on a side note, you will need to have the ODBC driver for Teradata installed for this to work)
Linked Server = just whatever name you want to give your linked server – I chose EDW (short for Enterprise Data Warehouse)
Product Name = again free text, I just wrote Teradata to let people know what kind of product you are connecting too.
Data Souce: This is the server name you are trying to connect to
Next, click Security tab.
I want to use my own credentials to connect to Teradata so I clicked Be Made Using This Security Context: ( the green arrow)
Type in your Username and password. Click Ok
Now go to create a new query in SSMS (SQL Server Management Studio)
We will be using a function called OPENQUERY. The syntax is as follows
Select * from OPENQUERY(LINKEDSERVER, QUERY)
SELECT * FROM OPENQUERY(EDW, 'SELECT USER_NM, LAST_NM, FIRST_NM FROM EMPLOYEE_TABLE')
We can use the data returned from Teradata in SQL Server by simply putting it in a table or a temp table as shown below
SELECT * into ##TempTable FROM OPENQUERY(EDW, 'SELECT USER_NM, LAST_NM, FIRST_NM FROM EMPLOYEE_TABLE')
We can also pass variables to our Teradata query. My preferred method is simply using a stored procedure.
CREATE PROCEDURE [LINKED_SERVER_QUERY] @USER VARCHAR(8) = NULL AS declare @query varchar(8000) = 'Select * from OPENQUERY(EDW, ''SELECT USER_NM, LAST_NM, FIRST_NM FROM EMPLOYEE_TABLE WHERE USER_NM = ''''' + @USER + ''''''')' exec(@query) GO exec [LINKED_SERVER_QUERY] @USER = 'blarson'