В лекциях 6-7 курса "Разработка и защита баз данных в Microsoft SQL Server 2005" вы научились переносить локальные данные на удаленные серверы баз данных, использовать разные варианты репликации, которые предлагает SQL Server 2005 и применять службы интеграции SQL Server для взаимодействия с различными источниками данных.
В реальных приложениях приходится работать с данными из различных удаленных источников; не всегда можно или желательно настроить схему репликации - иногда вам просто нужно выполнить единственный запрос, чтобы извлечь информацию в режиме реального времени, не ожидая реплицированных данных.
В этой лекции мы сконцентрируемся на том, как читать данные с удаленных источников и как осуществлять запись на удаленные источники данных в режиме реального времени. Этими источниками данных могут быть либо другие экземпляры SQL Server, либо иные источники данных, например, файлы Microsoft Office Excel или Microsoft Exchange Server.
Если нужно выполнить чтение данных на удаленном источнике данных, необходим способ объявить источник данных назначения, с которым вы хотите связаться и с которого нужно получить данные.
В приложении, которое соединяется с одним сервером базы данных, это обычно реализуется при помощи класса ADO.NET Connection. В этой лекции рассказывается, главным образом, об установлении соединения с удаленным источником данных из SQL Server при помощи кода T-SQL при недоступности ADO.NET.
Давайте ненадолго вернемся к применению ADO.NET. Чтобы читать данные на удаленных источниках из компонента среднего яруса, вам необходимо открыть объект Connection для каждого из различных источников данных, с которыми вы хотите связаться, и независимо запросить у каждого из них данные, которые нужно извлечь.
Как показано на рис. 4.1, при таком подходе коду среднего яруса приходится выполнять запросы к каждому из этих различных источников данных, используя API доступа каждого источника и выполняя слияние собранных результатов в общий результирующий набор.
(рис 4.1) Модель архитектуры для чтения данных с удаленного источника в среднем ярусеПриложение среднего яруса должно установить соединение с каждым из различных источников данных при помощи соответствующего поставщика доступа к данным. Например:
"Connect to pacific sales
Dim oracleConn As OracleConnection = New OracleConnection()
oracleConn.ConnectionString = "Data Source=MyOracleDB;Integrated Security=yes"
Dim oracleDA As New OracleDataAdapter("SELECT * FROM PacificSales", oracleConn)
"Connect to central sales
Dim excelConn As New OleDbConnection()
excelConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
"Data Source=C:\CentralSales.xls;Extended Properties=""Excel 8.0"""
Dim excelDA As New OleDbDataAdapter("SELECT * FROM [Sales$]", excelConn)
"Connect to atlantic sales
Dim sqlConn As New SqlConnection()
sqlConn.ConnectionString =
"Data Source=MySQLServer; Initial Catalog=MySQLDB; Integrated Security=SSPI"
Dim sqlDA As New SqlDataAdapter("SELECT * FROM AtlanticSales", sqlConn)
Затем приложение среднего яруса должно использовать объект DataSet для хранения всех данных, поступивших от различных источников, как в следующем примере кода: (Код этого раздела можно найти среди файлов примеров под именем MiddleTier.vb.txt ).
Dim salesData as New DataSet() oracleDA.Fill(salesData) excelDA.Fill(salesData) sqlDA.Fill(salesData)
Обобщаем: при реализации удаленного доступа в среднем ярусе каждый раз, когда необходимы данные о продажах, приложению нужно выполнить следующие действия:
Среднему ярусу приходится иметь дело с фактом распределения данных по различным физическим местам хранения.
Иногда слияние данных в среднем ярусе оказывается не такой простой операцией, как в этом примере, поскольку данные могут быть по разному представлены и отформатированы. Код, необходимый для манипуляций с разнородными источниками данных, в программировании в инфраструктуре .NET не всегда одинаков. Например, если нужно извлечь данные из текстового файла, вероятно, вы воспользовались бы классом в пространстве имен System.IO, но если данные нужно было бы извлечь из Active Directory, то, скорее, потребовался бы класс в пространстве имен System.DirectoryServices. Модели программирования для классов в этих пространствах имен весьма различны.
Еще один возможный подход в среднем ярусе - это запрос представлений, созданных в SQL Server. Представление должно отвечать за коммуникации со всеми разными источниками данных, выполняя слияние результатов и предоставляя вызывающему приложению один результирующий набор.
Как показано на рис. 4.2, если мы перенесем ответственность за слияние результатов на SQL Server, то сможем воспользоваться преимуществами следующих аспектов:
SQL Server 2005 предлагает два разных подхода к управлению соединениями с удаленными источниками данных:
Оба подхода требуют, чтобы удаленный источник данных поддерживал поставщики доступа к данным OLE DB. Это означает, что вы могли бы установить соединение с другими базами данных SQL Server, файловой системы Windows, Microsoft Exchange Server, Windows Active Directory Service, Microsoft Excel или любых других источников данных с поставщиком OLE DB.
(рис 4.2) Архитектурная модель для чтения данных из удаленных источников в SQL ServerНерегламентируемые запросы обеспечивают возможность установить соединение с удаленным источником данных и выполнить к нему запрос из кода T-SQL. Это разовое соединение функционирует только в течение выполняемой в данный момент операции.
В SQL Server 2005 поддержка нерегламентированных запросов по умолчанию отключена в интересах безопасности. Выполните перечисленные ниже действия, чтобы применить хранимую процедуру sp_configure для настройки поддержки нерегламентированных запросов или следующую процедуру для выполнения той же задачи через средство SQL Server
EnableAdHoc.sql в папке SqlScripts.sp_configure "show advanced options", 1; GO RECONFIGURE; GO sp_configure "Ad Hoc Distributed Queries", 1; GO RECONFIGURE; GO

OPENROWSET и OPENDATASOURCE ).
Используйте функцию OPENROWSET для того, чтобы открыть любой реляционный или не реляционный источник данных. SQL Server всегда устанавливает соединения с удаленными источниками данных с помощью интерфейса OLE DB. Удаленный источник данных должен поддерживать OLE DB, иначе соединение не будет установлено.
Функция OPENROWSET позволяет указать параметры конфигурации соединения, чтобы управлять соединением SQL Server с удаленным источником данных. Можно также воспользоваться определяемой поставщиком строкой запроса, в которой можно указать, какой ресурс следует запросить.
Northwind.mdb и Employees.xls устанавливаются вместе с другими файлами примеров в следующий каталог: C:\Documents and Settings\User\My Documents\Microsoft Press\Sql2005SBS_AppliedTechniques\Chapter08Если вы установили файлы примеров в другой каталог, необходимо внести в код соответствующие изменения.
Northwind.mdb на вашем компьютере. Этот пример находится в папке SqlScripts под именем OPENROWSET.sql ).SELECT OrderInfo.OrderID, OrderInfo.CustomerID, OrderInfo.EmployeeID
FROM OPENROWSET( "Microsoft.Jet.OLEDB.4.0",
"C:\Documents and Settings\User\My Documents\Microsoft Press
\Sql2005SBS_AppliedTechniques\Chapter08\Northwind.mdb';
"Admin";'',
"SELECT OrderID, CustomerID, EmployeeID FROM Orders") As OrderInfo
Результат, возвращенный OPENROWSET можно использовать в любой инструкции T-SQL, в которой ожидается табличный результат.
Следующие шаги описывают представление с функциями, аналогичными методу ADO.NET, о котором рассказывалось в начале этой лекции, для соединения с несколькими источниками данных из среднего яруса. Однако сейчас этот код будет использовать SQL Server для чтения данных из нескольких источников. Код для этого примера включен в файлы примеров в папку SqlScriptExamples под именем ReadDataFromMultiple Sources.sql. Необходимо изменить следующие шаги, чтобы они соответствовали источникам данных, которые действительно существуют в вашей сети (базе данных Access, SQL Server или Oracle).
CREATE VIEW GlobalSalesData AS
PreSalesDB, имейте в виду, что надо указать полный путь к файлу базы данных.SELECT PreSales.CustomerID, PreSales.Date, PreSales.Amount
FROM OPENROWSET(
"Microsoft.Jet.OLEDB.4.0",
"D:\PreSalesDB.MDB";'Admin';'Pass@word1',
"SELECT CustomerID, Date, Amount, Quarter FROM Opportunities
ORDER BY Date DESC') As PreSales
UNION
Microsoft.Jet.OLEDB.4.0 - это поставщик доступа к данным, который используется для доступа к удаленному источнику данных. Замените в этом коде путь к файлу, имя файла, имя пользователя и пароль на значения, соответствующие вашей среде.
SalesDB.SELECT Orders.CustomerID, Orders.Date, Orders.Amount
FROM OPENROWSET(
"SQLOLEDB",
"Server=Sales; Trusted_Connection=yes;",
"SalesDB.Sales.Orders") As Orders
UNION
SQLOLEDB - это поставщик доступа к данным, который используется для доступа к удаленному источнику данных SQL Server. Установка параметра Trusted_Connection на yes означает, что код будет проверять подлинность пользователя, используя учетные данные Windows для удаленного сервера. Замените имена сервера и базы данных на соответствующие значения для вашей среды.
PostSalesDB.SELECT PostSales.CustomerID, PostSales.Date, PostSales.Amount
FROM OPENROWSET(
"msdaora",
"Data Source=PostSalesDB;User Id=LowPrivilegeUser; Password=SomePwd;",
"SELECT CustomerID, Quarter, Date, Amount from Support") As PostSales
Здесь msdaora - это поставщик доступа к данным, который используется для доступа к удаленному источнику данных. Замените поставщик доступа к данным, источник данных, имя пользователя и пароль на значения, соответствующие вашей среде.
Результаты каждого запроса соединяются, чтобы обеспечить возвращение одного результирующего набора.
Функция OPENROWSET принимает два различных набора параметров для определения конфигурации строки соединения:
OPENROWSET("provider name", "provider specific string", "object|query")
OPENROWSET("provider name", "datasource"; "userid"; "password", "object|query")
Последний параметр (показанный в предыдущем примере кода как object | query) показывает, что для возвращения ответа нужен именно удаленный источник данных. Можно указать, что нужно извлечь объект данных, например, таблицу или представление, или результат данного запроса, как показано ниже (выделено полужирным шрифтом). (Код из этого раздела можно найти в примерах в папке SqlScriptExamples в файле OPENROWSETSyntaxExamples ).
SELECT PostSales.CustomerID, PostSales.Date, PostSales.Amount
FROM OPENROWSET(
"msdaora",
"Data Source=PostSalesDB;User Id=LowPrivilegeUser; Password=SomePwd;",
"SELECT CustomerID, Quarter, Date, Amount from Support") As PostSales
Источник для извлечения данных можно указать, используя трехкомпонентное имя, как показано ниже полужирным шрифтом, в котором SalesDB идентифицирует каталог (или базу данных), Sales идентифицирует схему, а Orders идентифицирует таблицу (или представление), которые следует возвратить.
SELECT Orders.CustomerID, Orders.Date, Orders.Amount
FROM OPENROWSET(
"SQLOLEDB",
"Server=Sales; Trusted_Connection=yes;",
"SalesDB.Sales.Orders") As Orders
WHERE Orders.Quarter = @Quarter
Полное уточненное имя состоит из четырех идентификаторов:
< ИмяСервера >.< ИмяКаталога>.< ИмяСхемы >.< ИмяРесурса >
Функция OPENDATASOURCE также позволяет устанавливать соединения с источниками данных, данные в которых упорядочены по каталогам, схемам и объектам. Главное отличие от функции OPENROWSET -это способ вызова функции OPENDATASOURCE. Обе функции возвращают результирующий набор OLE DB.
Функция OPENDATASOURCE занимает место компонента <Имя-Сервера> в полном уточненном имени (четырехкомпонентном), чтобы идентифицировать объект, который нужно извлечь из удаленного источника данных, как показано ниже. Имейте в виду, что необходимо изменить эти примеры, чтобы они соответствовали вашим серверам и базам данных. Следующий код можно найти в файлах примеров под именем UseOPENDATASOURCE ToConnectToAnotherServer.sql в папке SqlScriptExamples.
SELECT Orders.CustomerID, Orders.Date, Orders.Amount
FROM OPENDATASOURCE(
"SQLOLEDB",
"Server=Sales; Trusted_Connection=yes;").SalesDB.dbo.Orders
WHERE Orders.Quarter = @Quarter
В приведенном выше примере функция OPENDATASOURCE замещает имя сервера в полном уточненном имени таблицы Orders.
Следующий код показывает, как можно извлечь данные из файла Excel. Этот пример находится в папке SqlScripts под именем UseOPENDATASOURCEtoExtractXL.sql ).
SELECT Employees.FirstName,
Employees.LastName,
Employees.Title,
Employees.Country
FROM OPENDATASOURCE(
"Microsoft.Jet.OLEDB.4.0",
"Excel 8.0;DATABASE=C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\
Chapter08\EmployeeList.xls')...[Employees$] AS Employees
WHERE LastName IS NOT NULL ORDER BY Employees.Country DESC
Обратите внимание на то, что при каждом использовании функций OPENROWSET или OPENDATASOURCE вам приходится указывать информацию о конфигурации соединения.
В следующем примере обе функции - и OPENROWSET, и OPENDATASOURCE - используются для извлечения результатов из одного удаленного источника данных. Этот пример находится в папке SqlScript Examples под именем OPENROWSETandOPENDATASOURCEUsedTogether.sql.
SELECT Orders.CustomerID, Orders.Date, Orders.Amount
FROM
OPENROWSET( "SQLOLEDB", "Server=Sales; Trusted_Connection=yes;",
SalesDB.Sales.Orders) As Orders
INNER JOIN
OPENDATASOURCE("SQLOLEDB", "Server=Sales;
Trusted_Connection=yes;').SalesDB.Sales.OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
WHERE Sales.Quarter = 3
Функции OPENROWSET и OPENDATASOURCE требуют указания параметров конфигурации соединения при каждом соединении, даже если речь идет о соединении с одним сервером.
Вместо того, чтобы повторно устанавливать одни и те же настройки соединения при каждом применении функций OPENROWSET или OPENDATASOURCE, SQL Server позволяет сохранить эти параметры и назначить им идентификатор, чтоб их можно было повторно использовать, не вводя параметры конфигурации каждый раз заново; эта технология получила название "связанный сервер". Связанный сервер является, по сути, виртуальным сервером.
Связанные серверы имеют еще одно преимущество: их конфигурацию можно настраивать с помощью кода T-SQL или через интерфейс SQL Server Management Studio.
OPENROWSET или OPENDATASOURCE. Например, можно:Чтобы сконфигурировать связанный сервер с помощью кода T-SQL, необходимо использовать хранимую процедуру sp_addlinkedserver. Хранимая процедура sp_addlinkedserver для настройки конфигурации удаленных источников данных принимает несколько параметров.
В следующем примере демонстрируется готовый код T-SQL, необходимый для добавления удаленного сервера SQL Server в качестве связанного сервера. Код в этом разделе можно найти в файлах примеров в папке SqlScripts под именем LinkedServer.sql.
EXEC sp_addlinkedserver @server = "Sales", @srvproduct='SQL Server' GO
sp_addserver, которая использовалась для добавления ссылки на удаленный сервер. Эта хранимая процедура доступна и в SQL Server 2005, но она предназначена только для обеспечения обратной совместимости. Поддержка хранимой процедуры sp_addserver будет исключена из следующих версий SQL Server. В дальнейшем следует использовать только хранимую процедуру sp_addlinkedserver.Код для создания связанного сервера для файла Microsoft Excel.
- Связанный сервер для файла Excel
EXEC sp_addlinkedserver
@server = "MyEmployees",
@srvproduct = "Jet 4.0",
@provider = "Microsoft.Jet.OLEDB.4.0",
@datasrc = "C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\
Chapter08\EmployeeList.xls',
@provstr = "Excel 8.0" GO
Следующий код создает связанный сервер для базы данных Access.
- Связанный сервер для базы данных Access EXEC sp_addlinkedserver
@server = "PreSales",
@provider = "Microsoft.Jet.OLEDB.4.0",
@srvproduct = "OLEDB Provider for Jet",
@datasrc = "C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\
Chapter08\Northwind.mdb' GO
Еще один код, показывающий, как создать связанный сервер для базы данных стороннего разработчика, например, Oracle.
- Связанный сервер для базы данных Oracle EXEC sp_addlinkedserver @server = "PostSales", @srvproduct = "Oracle", @provider = "msdaora", @datasrc = "PostSalesDB" GO
sys.servers с фильтрацией по столбцу is_linked, как показано в следующем примере.SELECT * FROM sys.servers WHERE is_linked = 1
sp_addlinkedserver всегда выполняется успешно. В случае, если вы указали неправильное значение параметра, об этом можно узнать только в процессе выполнения.Если нужно удалить уже зарегистрированный связанный сервер, можно воспользоваться хранимой процедурой sp_dropserver, как показано в следующем примере кода.
EXEC sp_dropserver "MyEmployees" GO
Хранимая процедура sp_dropserver получает один параметр, идентификатор связанного сервера, который нужно удалить.
Конфигурацию связанных серверов можно настраивать и через SQL Server Management Studio.





При добавлении нового связанного сервера с помощью T-SQL или через SQL Server Management Studio будут возвращены совершенно одинаковые результаты.
Если нужно удалить существующий связанный сервер в SQL Server Management Studio, выполните следующие действия:
DELETE ) на клавиатуре. Откроется окно Delete Object (Удаление объекта). Нажмите клавишу ОК, чтобы удалить связанный сервер.Существует три способа использования связанного сервера в коде T-SQL:
EXECUTE… AT для отправки EXECUTE обычно используется для выполнения инструкций DDL (языка определения данных) на удаленном источнике данных или для вызова OPENQUERY для отправки OPENQUERY можно использовать в коде T-SQL везде, где ожидается табличный результат.Идентификатор связанного сервера становится компонентом Server Name (ИмяСервера) в четырехкомпонентном имени удаленного источника данных, как показано ниже. Код в этом разделе можно найти в файлах примеров в папке SqlScripts под именем LinkedServerFullyQualified Name.sql.
EXEC sp addlinkedserver @server = "SalesServer", @srvproduct='SQL Server' GO SELECT CustomerID, Date, Amount FROM SalesServer.SalesDB.Sales.Orders WHERE Quarter = @Quarter
Такой же синтаксис можно использовать для доступа к файлу Excel, сконфигурированному как связанный сервер с названием MyEmployees. В этом примере Employee$ - это имя запрашиваемой страницы Excel.
EXEC sp addlinkedserver
@server = "MyEmployees",
@srvproduct = "Jet 4.0",
@provider = "Microsoft.Jet.OLEDB.4.0",
@datasrc = "C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\
Chapter08\EmployeeList.xls',
@provstr = "Excel 8.0" GO SELECT * FROM MyEmployees...Employees$
Предложение EXECUTE… AT имеет следующий синтаксис:
EXECUTE ("query") AT LinkedServerIdentifier
Обратите внимание на то, что любой запрос, вписанный между апострофами ("), будет перенаправлен удаленному источнику данных для выполнения. Удаленный источник данных, если нужно, может возвратить набор строк OLE DB.
Конструкция EXECUTE… AT обычно используется для инструкций языка DDL, таких, как CREATE TABLE, CREATE PROCEDURE или / DROP VIEW, для предложений INSERT, UPDATE или DELETE или для выполнения SqlScripts под именем LinkedServerExecuteAt.sql.)
EXEC sp_addlinkedserver @server = "SalesServer",
@srvproduct='SQL Server' GO
EXECUTE ("CalculateCommissions") AT SalesServer
В этом коде хранимая процедура CalculateCommissions существует в базе данных Sales на удаленном источнике данных. Удаленный сервер SQL Server был сконфигурирован как связанный сервер с именем SalesServer.
Использование функции OPENQUERY аналогично использованию функций OPENROWSET и OPENDATASOURCE. Эта функция может использоваться в любом коде T-SQL, в котором ожидается возвращение имени таблицы.
Однако в отличие от функций OPENROWSET и OPENDATASOURCE, функция OPENQUERY использует имя связанного сервера в качестве входного параметра, поэтому не нужно указывать конфигурацию соединения при каждом удаленном вызове.
Синтаксис функции OPENQUERY:
SELECT columns FROM OPENQUERY(LinkedServerIdentifier, "query")
В следующем примере связанный сервер SalesServer представляет собой ссылку на сервер SQL Server с именем Sales, к нему выполняется доступ через функцию OPENQUERY для извлечения информации обо всех значениях из столбца Orders.. Внутреннее соединение в ключах CustomerID объявляется между удаленной таблицей Orders и локальной таблицей OrderDetails. Этот пример находится в папке SqlScriptExamples под именем OPENQUERY.sql.
EXEC sp_addlinkedserver @server='SalesServer', @srvproduct='', @provider='SQLNCLI', @datasrc='SrvrName\SrvrInstance', @catalog='Sales' GO SELECT Orders.CustomerID, OrderDetails.Date, OrderDetails.Amount FROM OPENQUERY(SalesServer, "SELECT * FROM ORDERS") AS Orders INNER JOIN OrderDetails ON Orders.CustomerID = OrderDetails.CustomerID WHERE Orders.Quarter = @Quarter
Методы, которые использовались для чтения данных из удаленных источников из SQL Server, можно также применить для выполнения предложений INSERT, UPDATE и DELETE на удаленных источниках данных.
Функции OPENROWSET и OPENDATASOURCE могут использоваться в предложениях INSERT, UPDATE и DELETE для манипуляций с данными на удаленном источнике данных.
При использовании функции OPENROWSET можно указать запрос для выполнения или полное уточненное имя, которое ссылается на обновляемую таблицу.
Следующий код показывает, как добавить новую запись в файл Excel. (Код в этом разделе можно найти в файлах примеров в папке SqlScripts под именем UsingAdHocToUpdate.sql )/
INSERT OPENROWSET(
"Microsoft.Jet.OLEDB.4.0",
"Excel 8.0;DATABASE=C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\
Chapter08\EmployeeList.xls', "SELECT FirstName, LastName, Title, Region FROM [Employees$]") VALUES ("John",
"Doe",
"Consultant",
"CA")
Код, который приводится ниже, показывает, как вставить новую запись в удаленную базу данных SQL Server.
- Вставка в удаленную базу данных SQl Server INSERT OPENROWSET( "SQLOLEDB", "Server=Sales; Trusted_Connection=yes;", "SalesDB.Sales.Orders") VALUES (175642, "2001-10-04", 6500.05) GO
Функция OPENDATASOURCE может использоваться для вставки ( INSERT ), обновления ( UPDATE ) или удаления ( DELETE ) данных в удаленной таблице с полным уточненным именем. В этом случае запрос определять не нужно. Следующий код демонстрирует этот метод на примере файла Microsoft Office Excel.
INSERT OPENDATASOURCE( "Microsoft.Jet.OLEDB.4.0", "Excel 8.0;DATABASE=C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\Chapter08\
EmployeeList.xls')...[Employees$] VALUES ("99",
"Doe",
"John",
"Tester",
"Mr.",
'12/06/1964',
"5/1/1995",
"507 20th Ave. S.",
"Seattle",
"WA",
"98122",
"USA",
"(206) 555-9857",
"5467",
"testing",
"2")
После того, как вы создали связанный сервер при помощи хранимой процедуры sp_addlinkedserver, можно использовать эту ссылку для выполнения предложений INSERT, UPDATE и DELETE в удаленной таблице с полным уточненным именем.
Следующий код демонстрирует этот метод на примере удаленной базы данных SQL Server. (Код из этого раздела можно найти в файлах примеров в папке SqlScripts под именем UsingLinkedServerToUpdate.sql ).
EXEC sp_addlinkedserver @server = "SalesServer", @srvproduct=N'SQL Server' GO DELETE SalesServer.SalesDB.Sales.Orders WHERE Quarter = 3
Для того, чтобы использовать функцию OPENQUERY, вместо определения выполняемого запроса нужно указать имя таблицы, в которой нужно выполнить операции INSERT, UPDATE или DELETE.
Следующий код показывает этот метод на примере файла Excel.
EXEC sp_addlinkedserver @server = "MyEmployees", @srvproduct = "Jet 4.0", @provider = "Microsoft.Jet.OLEDB.4.0", @datasrc = "C:\Documents and Settings\User\My Documents\ Microsoft Press\Sql2005SBS_AppliedTechniques\ Chapter08\EmployeeList.xls', @provstr = "Excel 8.0" GO UPDATE OPENQUERY(MyEmployees, "SELECT * FROM [Employees$]") SET LastName = "Newname" WHERE Region = "CA"
В этой лекции речь шла, главным образом, о том, как читать и записывать данные на удаленном источнике. Удаленные источники данных могут представлять собой другие экземпляры сервера SQL Server или источники данных других типов. Все действия, которые были описаны выше, можно выполнять через инструкции T-SQL. SQL Server Management Studio предоставляет интерфейс пользователя для управления удаленными источниками данных.
| Чтобы | Выполните следующие действия |
|---|---|
| Иногда выполнять запросы к удаленному источнику посредством отправки транзитного запроса | Используйте функцию OPENROWSET. |
| Иногда выполнять запросы к удаленным ресурсам посредством ссылки на объект с использованием четырехкомпонентного имени | Используйте функцию OPENDATASOURCE. |
| Создать новый связанный сервер через интерфейс Microsoft SQL Server Management Studio | В окне Обозревателя объектов SQLServer Management Studio разверните экземпляр SQL Server, откройте папку Server Objects (Объекты сервера), а затем папку Linked Servers (Связанные серверы). |
| Создать новый связанный сервер путем программирования | Используйте системную хранимую процедуру sp_addlinkedserver. |
| Удалить связанный сервер посредством программирования | Используйте системную хранимую процедуру sp_dropserver. |
| Часто выполнять запросы к удаленному ресурсу посредством отправки транзитного запроса | Определите связанный сервер и используйте функцию OPENQUERY. |
| Часто выполнять запросы к удаленным ресурсам посредством ссылки на объект с использованием четырехкомпонентного имени | Определите связанный сервер и используйте идентификатор связанного сервера в качестве компонента <ИмяСервера> полного уточненного имени. |
| Часто выполнять инструкции DDL и хранимые процедуры в отношении удаленного ресурса | Определите связанный сервер и используйте конструкцию EXECUTE…AT. |
В лекциях 6-7 курса "Разработка и защита баз данных в Microsoft SQL Server 2005" вы научились переносить локальные данные на удаленные серверы баз данных, использовать разные варианты репликации, которые предлагает SQL Server 2005 и применять службы интеграции SQL Server для взаимодействия с различными источниками данных.
В реальных приложениях приходится работать с данными из различных удаленных источников; не всегда можно или желательно настроить схему репликации - иногда вам просто нужно выполнить единственный запрос, чтобы извлечь информацию в режиме реального времени, не ожидая реплицированных данных.
В этой лекции мы сконцентрируемся на том, как читать данные с удаленных источников и как осуществлять запись на удаленные источники данных в режиме реального времени. Этими источниками данных могут быть либо другие экземпляры SQL Server, либо иные источники данных, например, файлы Microsoft Office Excel или Microsoft Exchange Server.
Если нужно выполнить чтение данных на удаленном источнике данных, необходим способ объявить источник данных назначения, с которым вы хотите связаться и с которого нужно получить данные.
В приложении, которое соединяется с одним сервером базы данных, это обычно реализуется при помощи класса ADO.NET Connection. В этой лекции рассказывается, главным образом, об установлении соединения с удаленным источником данных из SQL Server при помощи кода T-SQL при недоступности ADO.NET.
Давайте ненадолго вернемся к применению ADO.NET. Чтобы читать данные на удаленных источниках из компонента среднего яруса, вам необходимо открыть объект Connection для каждого из различных источников данных, с которыми вы хотите связаться, и независимо запросить у каждого из них данные, которые нужно извлечь.
Как показано на рис. 4.1, при таком подходе коду среднего яруса приходится выполнять запросы к каждому из этих различных источников данных, используя API доступа каждого источника и выполняя слияние собранных результатов в общий результирующий набор.
(рис 4.1) Модель архитектуры для чтения данных с удаленного источника в среднем ярусеПриложение среднего яруса должно установить соединение с каждым из различных источников данных при помощи соответствующего поставщика доступа к данным. Например:
"Connect to pacific sales
Dim oracleConn As OracleConnection = New OracleConnection()
oracleConn.ConnectionString = "Data Source=MyOracleDB;Integrated Security=yes"
Dim oracleDA As New OracleDataAdapter("SELECT * FROM PacificSales", oracleConn)
"Connect to central sales
Dim excelConn As New OleDbConnection()
excelConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
"Data Source=C:\CentralSales.xls;Extended Properties=""Excel 8.0"""
Dim excelDA As New OleDbDataAdapter("SELECT * FROM [Sales$]", excelConn)
"Connect to atlantic sales
Dim sqlConn As New SqlConnection()
sqlConn.ConnectionString =
"Data Source=MySQLServer; Initial Catalog=MySQLDB; Integrated Security=SSPI"
Dim sqlDA As New SqlDataAdapter("SELECT * FROM AtlanticSales", sqlConn)
Затем приложение среднего яруса должно использовать объект DataSet для хранения всех данных, поступивших от различных источников, как в следующем примере кода: (Код этого раздела можно найти среди файлов примеров под именем MiddleTier.vb.txt ).
Dim salesData as New DataSet() oracleDA.Fill(salesData) excelDA.Fill(salesData) sqlDA.Fill(salesData)
Обобщаем: при реализации удаленного доступа в среднем ярусе каждый раз, когда необходимы данные о продажах, приложению нужно выполнить следующие действия:
Среднему ярусу приходится иметь дело с фактом распределения данных по различным физическим местам хранения.
Иногда слияние данных в среднем ярусе оказывается не такой простой операцией, как в этом примере, поскольку данные могут быть по разному представлены и отформатированы. Код, необходимый для манипуляций с разнородными источниками данных, в программировании в инфраструктуре .NET не всегда одинаков. Например, если нужно извлечь данные из текстового файла, вероятно, вы воспользовались бы классом в пространстве имен System.IO, но если данные нужно было бы извлечь из Active Directory, то, скорее, потребовался бы класс в пространстве имен System.DirectoryServices. Модели программирования для классов в этих пространствах имен весьма различны.
Еще один возможный подход в среднем ярусе - это запрос представлений, созданных в SQL Server. Представление должно отвечать за коммуникации со всеми разными источниками данных, выполняя слияние результатов и предоставляя вызывающему приложению один результирующий набор.
Как показано на рис. 4.2, если мы перенесем ответственность за слияние результатов на SQL Server, то сможем воспользоваться преимуществами следующих аспектов:
SQL Server 2005 предлагает два разных подхода к управлению соединениями с удаленными источниками данных:
Оба подхода требуют, чтобы удаленный источник данных поддерживал поставщики доступа к данным OLE DB. Это означает, что вы могли бы установить соединение с другими базами данных SQL Server, файловой системы Windows, Microsoft Exchange Server, Windows Active Directory Service, Microsoft Excel или любых других источников данных с поставщиком OLE DB.
(рис 4.2) Архитектурная модель для чтения данных из удаленных источников в SQL ServerНерегламентируемые запросы обеспечивают возможность установить соединение с удаленным источником данных и выполнить к нему запрос из кода T-SQL. Это разовое соединение функционирует только в течение выполняемой в данный момент операции.
В SQL Server 2005 поддержка нерегламентированных запросов по умолчанию отключена в интересах безопасности. Выполните перечисленные ниже действия, чтобы применить хранимую процедуру sp_configure для настройки поддержки нерегламентированных запросов или следующую процедуру для выполнения той же задачи через средство SQL Server
EnableAdHoc.sql в папке SqlScripts.sp_configure "show advanced options", 1; GO RECONFIGURE; GO sp_configure "Ad Hoc Distributed Queries", 1; GO RECONFIGURE; GO

OPENROWSET и OPENDATASOURCE ).
Используйте функцию OPENROWSET для того, чтобы открыть любой реляционный или не реляционный источник данных. SQL Server всегда устанавливает соединения с удаленными источниками данных с помощью интерфейса OLE DB. Удаленный источник данных должен поддерживать OLE DB, иначе соединение не будет установлено.
Функция OPENROWSET позволяет указать параметры конфигурации соединения, чтобы управлять соединением SQL Server с удаленным источником данных. Можно также воспользоваться определяемой поставщиком строкой запроса, в которой можно указать, какой ресурс следует запросить.
Northwind.mdb и Employees.xls устанавливаются вместе с другими файлами примеров в следующий каталог: C:\Documents and Settings\User\My Documents\Microsoft Press\Sql2005SBS_AppliedTechniques\Chapter08Если вы установили файлы примеров в другой каталог, необходимо внести в код соответствующие изменения.
Northwind.mdb на вашем компьютере. Этот пример находится в папке SqlScripts под именем OPENROWSET.sql ).SELECT OrderInfo.OrderID, OrderInfo.CustomerID, OrderInfo.EmployeeID
FROM OPENROWSET( "Microsoft.Jet.OLEDB.4.0",
"C:\Documents and Settings\User\My Documents\Microsoft Press
\Sql2005SBS_AppliedTechniques\Chapter08\Northwind.mdb';
"Admin";'',
"SELECT OrderID, CustomerID, EmployeeID FROM Orders") As OrderInfo
Результат, возвращенный OPENROWSET можно использовать в любой инструкции T-SQL, в которой ожидается табличный результат.
Следующие шаги описывают представление с функциями, аналогичными методу ADO.NET, о котором рассказывалось в начале этой лекции, для соединения с несколькими источниками данных из среднего яруса. Однако сейчас этот код будет использовать SQL Server для чтения данных из нескольких источников. Код для этого примера включен в файлы примеров в папку SqlScriptExamples под именем ReadDataFromMultiple Sources.sql. Необходимо изменить следующие шаги, чтобы они соответствовали источникам данных, которые действительно существуют в вашей сети (базе данных Access, SQL Server или Oracle).
CREATE VIEW GlobalSalesData AS
PreSalesDB, имейте в виду, что надо указать полный путь к файлу базы данных.SELECT PreSales.CustomerID, PreSales.Date, PreSales.Amount
FROM OPENROWSET(
"Microsoft.Jet.OLEDB.4.0",
"D:\PreSalesDB.MDB";'Admin';'Pass@word1',
"SELECT CustomerID, Date, Amount, Quarter FROM Opportunities
ORDER BY Date DESC') As PreSales
UNION
Microsoft.Jet.OLEDB.4.0 - это поставщик доступа к данным, который используется для доступа к удаленному источнику данных. Замените в этом коде путь к файлу, имя файла, имя пользователя и пароль на значения, соответствующие вашей среде.
SalesDB.SELECT Orders.CustomerID, Orders.Date, Orders.Amount
FROM OPENROWSET(
"SQLOLEDB",
"Server=Sales; Trusted_Connection=yes;",
"SalesDB.Sales.Orders") As Orders
UNION
SQLOLEDB - это поставщик доступа к данным, который используется для доступа к удаленному источнику данных SQL Server. Установка параметра Trusted_Connection на yes означает, что код будет проверять подлинность пользователя, используя учетные данные Windows для удаленного сервера. Замените имена сервера и базы данных на соответствующие значения для вашей среды.
PostSalesDB.SELECT PostSales.CustomerID, PostSales.Date, PostSales.Amount
FROM OPENROWSET(
"msdaora",
"Data Source=PostSalesDB;User Id=LowPrivilegeUser; Password=SomePwd;",
"SELECT CustomerID, Quarter, Date, Amount from Support") As PostSales
Здесь msdaora - это поставщик доступа к данным, который используется для доступа к удаленному источнику данных. Замените поставщик доступа к данным, источник данных, имя пользователя и пароль на значения, соответствующие вашей среде.
Результаты каждого запроса соединяются, чтобы обеспечить возвращение одного результирующего набора.
Функция OPENROWSET принимает два различных набора параметров для определения конфигурации строки соединения:
OPENROWSET("provider name", "provider specific string", "object|query")
OPENROWSET("provider name", "datasource"; "userid"; "password", "object|query")
Последний параметр (показанный в предыдущем примере кода как object | query) показывает, что для возвращения ответа нужен именно удаленный источник данных. Можно указать, что нужно извлечь объект данных, например, таблицу или представление, или результат данного запроса, как показано ниже (выделено полужирным шрифтом). (Код из этого раздела можно найти в примерах в папке SqlScriptExamples в файле OPENROWSETSyntaxExamples ).
SELECT PostSales.CustomerID, PostSales.Date, PostSales.Amount
FROM OPENROWSET(
"msdaora",
"Data Source=PostSalesDB;User Id=LowPrivilegeUser; Password=SomePwd;",
"SELECT CustomerID, Quarter, Date, Amount from Support") As PostSales
Источник для извлечения данных можно указать, используя трехкомпонентное имя, как показано ниже полужирным шрифтом, в котором SalesDB идентифицирует каталог (или базу данных), Sales идентифицирует схему, а Orders идентифицирует таблицу (или представление), которые следует возвратить.
SELECT Orders.CustomerID, Orders.Date, Orders.Amount
FROM OPENROWSET(
"SQLOLEDB",
"Server=Sales; Trusted_Connection=yes;",
"SalesDB.Sales.Orders") As Orders
WHERE Orders.Quarter = @Quarter
Полное уточненное имя состоит из четырех идентификаторов:
< ИмяСервера >.< ИмяКаталога>.< ИмяСхемы >.< ИмяРесурса >
Функция OPENDATASOURCE также позволяет устанавливать соединения с источниками данных, данные в которых упорядочены по каталогам, схемам и объектам. Главное отличие от функции OPENROWSET -это способ вызова функции OPENDATASOURCE. Обе функции возвращают результирующий набор OLE DB.
Функция OPENDATASOURCE занимает место компонента <Имя-Сервера> в полном уточненном имени (четырехкомпонентном), чтобы идентифицировать объект, который нужно извлечь из удаленного источника данных, как показано ниже. Имейте в виду, что необходимо изменить эти примеры, чтобы они соответствовали вашим серверам и базам данных. Следующий код можно найти в файлах примеров под именем UseOPENDATASOURCE ToConnectToAnotherServer.sql в папке SqlScriptExamples.
SELECT Orders.CustomerID, Orders.Date, Orders.Amount
FROM OPENDATASOURCE(
"SQLOLEDB",
"Server=Sales; Trusted_Connection=yes;").SalesDB.dbo.Orders
WHERE Orders.Quarter = @Quarter
В приведенном выше примере функция OPENDATASOURCE замещает имя сервера в полном уточненном имени таблицы Orders.
Следующий код показывает, как можно извлечь данные из файла Excel. Этот пример находится в папке SqlScripts под именем UseOPENDATASOURCEtoExtractXL.sql ).
SELECT Employees.FirstName,
Employees.LastName,
Employees.Title,
Employees.Country
FROM OPENDATASOURCE(
"Microsoft.Jet.OLEDB.4.0",
"Excel 8.0;DATABASE=C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\
Chapter08\EmployeeList.xls')...[Employees$] AS Employees
WHERE LastName IS NOT NULL ORDER BY Employees.Country DESC
Обратите внимание на то, что при каждом использовании функций OPENROWSET или OPENDATASOURCE вам приходится указывать информацию о конфигурации соединения.
В следующем примере обе функции - и OPENROWSET, и OPENDATASOURCE - используются для извлечения результатов из одного удаленного источника данных. Этот пример находится в папке SqlScript Examples под именем OPENROWSETandOPENDATASOURCEUsedTogether.sql.
SELECT Orders.CustomerID, Orders.Date, Orders.Amount
FROM
OPENROWSET( "SQLOLEDB", "Server=Sales; Trusted_Connection=yes;",
SalesDB.Sales.Orders) As Orders
INNER JOIN
OPENDATASOURCE("SQLOLEDB", "Server=Sales;
Trusted_Connection=yes;').SalesDB.Sales.OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
WHERE Sales.Quarter = 3
Функции OPENROWSET и OPENDATASOURCE требуют указания параметров конфигурации соединения при каждом соединении, даже если речь идет о соединении с одним сервером.
Вместо того, чтобы повторно устанавливать одни и те же настройки соединения при каждом применении функций OPENROWSET или OPENDATASOURCE, SQL Server позволяет сохранить эти параметры и назначить им идентификатор, чтоб их можно было повторно использовать, не вводя параметры конфигурации каждый раз заново; эта технология получила название "связанный сервер". Связанный сервер является, по сути, виртуальным сервером.
Связанные серверы имеют еще одно преимущество: их конфигурацию можно настраивать с помощью кода T-SQL или через интерфейс SQL Server Management Studio.
OPENROWSET или OPENDATASOURCE. Например, можно:Чтобы сконфигурировать связанный сервер с помощью кода T-SQL, необходимо использовать хранимую процедуру sp_addlinkedserver. Хранимая процедура sp_addlinkedserver для настройки конфигурации удаленных источников данных принимает несколько параметров.
В следующем примере демонстрируется готовый код T-SQL, необходимый для добавления удаленного сервера SQL Server в качестве связанного сервера. Код в этом разделе можно найти в файлах примеров в папке SqlScripts под именем LinkedServer.sql.
EXEC sp_addlinkedserver @server = "Sales", @srvproduct='SQL Server' GO
sp_addserver, которая использовалась для добавления ссылки на удаленный сервер. Эта хранимая процедура доступна и в SQL Server 2005, но она предназначена только для обеспечения обратной совместимости. Поддержка хранимой процедуры sp_addserver будет исключена из следующих версий SQL Server. В дальнейшем следует использовать только хранимую процедуру sp_addlinkedserver.Код для создания связанного сервера для файла Microsoft Excel.
- Связанный сервер для файла Excel
EXEC sp_addlinkedserver
@server = "MyEmployees",
@srvproduct = "Jet 4.0",
@provider = "Microsoft.Jet.OLEDB.4.0",
@datasrc = "C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\
Chapter08\EmployeeList.xls',
@provstr = "Excel 8.0" GO
Следующий код создает связанный сервер для базы данных Access.
- Связанный сервер для базы данных Access EXEC sp_addlinkedserver
@server = "PreSales",
@provider = "Microsoft.Jet.OLEDB.4.0",
@srvproduct = "OLEDB Provider for Jet",
@datasrc = "C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\
Chapter08\Northwind.mdb' GO
Еще один код, показывающий, как создать связанный сервер для базы данных стороннего разработчика, например, Oracle.
- Связанный сервер для базы данных Oracle EXEC sp_addlinkedserver @server = "PostSales", @srvproduct = "Oracle", @provider = "msdaora", @datasrc = "PostSalesDB" GO
sys.servers с фильтрацией по столбцу is_linked, как показано в следующем примере.SELECT * FROM sys.servers WHERE is_linked = 1
sp_addlinkedserver всегда выполняется успешно. В случае, если вы указали неправильное значение параметра, об этом можно узнать только в процессе выполнения.Если нужно удалить уже зарегистрированный связанный сервер, можно воспользоваться хранимой процедурой sp_dropserver, как показано в следующем примере кода.
EXEC sp_dropserver "MyEmployees" GO
Хранимая процедура sp_dropserver получает один параметр, идентификатор связанного сервера, который нужно удалить.
Конфигурацию связанных серверов можно настраивать и через SQL Server Management Studio.





При добавлении нового связанного сервера с помощью T-SQL или через SQL Server Management Studio будут возвращены совершенно одинаковые результаты.
Если нужно удалить существующий связанный сервер в SQL Server Management Studio, выполните следующие действия:
DELETE ) на клавиатуре. Откроется окно Delete Object (Удаление объекта). Нажмите клавишу ОК, чтобы удалить связанный сервер.Существует три способа использования связанного сервера в коде T-SQL:
EXECUTE… AT для отправки EXECUTE обычно используется для выполнения инструкций DDL (языка определения данных) на удаленном источнике данных или для вызова OPENQUERY для отправки OPENQUERY можно использовать в коде T-SQL везде, где ожидается табличный результат.Идентификатор связанного сервера становится компонентом Server Name (ИмяСервера) в четырехкомпонентном имени удаленного источника данных, как показано ниже. Код в этом разделе можно найти в файлах примеров в папке SqlScripts под именем LinkedServerFullyQualified Name.sql.
EXEC sp addlinkedserver @server = "SalesServer", @srvproduct='SQL Server' GO SELECT CustomerID, Date, Amount FROM SalesServer.SalesDB.Sales.Orders WHERE Quarter = @Quarter
Такой же синтаксис можно использовать для доступа к файлу Excel, сконфигурированному как связанный сервер с названием MyEmployees. В этом примере Employee$ - это имя запрашиваемой страницы Excel.
EXEC sp addlinkedserver
@server = "MyEmployees",
@srvproduct = "Jet 4.0",
@provider = "Microsoft.Jet.OLEDB.4.0",
@datasrc = "C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\
Chapter08\EmployeeList.xls',
@provstr = "Excel 8.0" GO SELECT * FROM MyEmployees...Employees$
Предложение EXECUTE… AT имеет следующий синтаксис:
EXECUTE ("query") AT LinkedServerIdentifier
Обратите внимание на то, что любой запрос, вписанный между апострофами ("), будет перенаправлен удаленному источнику данных для выполнения. Удаленный источник данных, если нужно, может возвратить набор строк OLE DB.
Конструкция EXECUTE… AT обычно используется для инструкций языка DDL, таких, как CREATE TABLE, CREATE PROCEDURE или / DROP VIEW, для предложений INSERT, UPDATE или DELETE или для выполнения SqlScripts под именем LinkedServerExecuteAt.sql.)
EXEC sp_addlinkedserver @server = "SalesServer",
@srvproduct='SQL Server' GO
EXECUTE ("CalculateCommissions") AT SalesServer
В этом коде хранимая процедура CalculateCommissions существует в базе данных Sales на удаленном источнике данных. Удаленный сервер SQL Server был сконфигурирован как связанный сервер с именем SalesServer.
Использование функции OPENQUERY аналогично использованию функций OPENROWSET и OPENDATASOURCE. Эта функция может использоваться в любом коде T-SQL, в котором ожидается возвращение имени таблицы.
Однако в отличие от функций OPENROWSET и OPENDATASOURCE, функция OPENQUERY использует имя связанного сервера в качестве входного параметра, поэтому не нужно указывать конфигурацию соединения при каждом удаленном вызове.
Синтаксис функции OPENQUERY:
SELECT columns FROM OPENQUERY(LinkedServerIdentifier, "query")
В следующем примере связанный сервер SalesServer представляет собой ссылку на сервер SQL Server с именем Sales, к нему выполняется доступ через функцию OPENQUERY для извлечения информации обо всех значениях из столбца Orders.. Внутреннее соединение в ключах CustomerID объявляется между удаленной таблицей Orders и локальной таблицей OrderDetails. Этот пример находится в папке SqlScriptExamples под именем OPENQUERY.sql.
EXEC sp_addlinkedserver @server='SalesServer', @srvproduct='', @provider='SQLNCLI', @datasrc='SrvrName\SrvrInstance', @catalog='Sales' GO SELECT Orders.CustomerID, OrderDetails.Date, OrderDetails.Amount FROM OPENQUERY(SalesServer, "SELECT * FROM ORDERS") AS Orders INNER JOIN OrderDetails ON Orders.CustomerID = OrderDetails.CustomerID WHERE Orders.Quarter = @Quarter
Методы, которые использовались для чтения данных из удаленных источников из SQL Server, можно также применить для выполнения предложений INSERT, UPDATE и DELETE на удаленных источниках данных.
Функции OPENROWSET и OPENDATASOURCE могут использоваться в предложениях INSERT, UPDATE и DELETE для манипуляций с данными на удаленном источнике данных.
При использовании функции OPENROWSET можно указать запрос для выполнения или полное уточненное имя, которое ссылается на обновляемую таблицу.
Следующий код показывает, как добавить новую запись в файл Excel. (Код в этом разделе можно найти в файлах примеров в папке SqlScripts под именем UsingAdHocToUpdate.sql )/
INSERT OPENROWSET(
"Microsoft.Jet.OLEDB.4.0",
"Excel 8.0;DATABASE=C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\
Chapter08\EmployeeList.xls', "SELECT FirstName, LastName, Title, Region FROM [Employees$]") VALUES ("John",
"Doe",
"Consultant",
"CA")
Код, который приводится ниже, показывает, как вставить новую запись в удаленную базу данных SQL Server.
- Вставка в удаленную базу данных SQl Server INSERT OPENROWSET( "SQLOLEDB", "Server=Sales; Trusted_Connection=yes;", "SalesDB.Sales.Orders") VALUES (175642, "2001-10-04", 6500.05) GO
Функция OPENDATASOURCE может использоваться для вставки ( INSERT ), обновления ( UPDATE ) или удаления ( DELETE ) данных в удаленной таблице с полным уточненным именем. В этом случае запрос определять не нужно. Следующий код демонстрирует этот метод на примере файла Microsoft Office Excel.
INSERT OPENDATASOURCE( "Microsoft.Jet.OLEDB.4.0", "Excel 8.0;DATABASE=C:\Documents and Settings\User\My Documents\
Microsoft Press\Sql2005SBS_AppliedTechniques\Chapter08\
EmployeeList.xls')...[Employees$] VALUES ("99",
"Doe",
"John",
"Tester",
"Mr.",
'12/06/1964',
"5/1/1995",
"507 20th Ave. S.",
"Seattle",
"WA",
"98122",
"USA",
"(206) 555-9857",
"5467",
"testing",
"2")
После того, как вы создали связанный сервер при помощи хранимой процедуры sp_addlinkedserver, можно использовать эту ссылку для выполнения предложений INSERT, UPDATE и DELETE в удаленной таблице с полным уточненным именем.
Следующий код демонстрирует этот метод на примере удаленной базы данных SQL Server. (Код из этого раздела можно найти в файлах примеров в папке SqlScripts под именем UsingLinkedServerToUpdate.sql ).
EXEC sp_addlinkedserver @server = "SalesServer", @srvproduct=N'SQL Server' GO DELETE SalesServer.SalesDB.Sales.Orders WHERE Quarter = 3
Для того, чтобы использовать функцию OPENQUERY, вместо определения выполняемого запроса нужно указать имя таблицы, в которой нужно выполнить операции INSERT, UPDATE или DELETE.
Следующий код показывает этот метод на примере файла Excel.
EXEC sp_addlinkedserver @server = "MyEmployees", @srvproduct = "Jet 4.0", @provider = "Microsoft.Jet.OLEDB.4.0", @datasrc = "C:\Documents and Settings\User\My Documents\ Microsoft Press\Sql2005SBS_AppliedTechniques\ Chapter08\EmployeeList.xls', @provstr = "Excel 8.0" GO UPDATE OPENQUERY(MyEmployees, "SELECT * FROM [Employees$]") SET LastName = "Newname" WHERE Region = "CA"
В этой лекции речь шла, главным образом, о том, как читать и записывать данные на удаленном источнике. Удаленные источники данных могут представлять собой другие экземпляры сервера SQL Server или источники данных других типов. Все действия, которые были описаны выше, можно выполнять через инструкции T-SQL. SQL Server Management Studio предоставляет интерфейс пользователя для управления удаленными источниками данных.
| Чтобы | Выполните следующие действия |
|---|---|
| Иногда выполнять запросы к удаленному источнику посредством отправки транзитного запроса | Используйте функцию OPENROWSET. |
| Иногда выполнять запросы к удаленным ресурсам посредством ссылки на объект с использованием четырехкомпонентного имени | Используйте функцию OPENDATASOURCE. |
| Создать новый связанный сервер через интерфейс Microsoft SQL Server Management Studio | В окне Обозревателя объектов SQLServer Management Studio разверните экземпляр SQL Server, откройте папку Server Objects (Объекты сервера), а затем папку Linked Servers (Связанные серверы). |
| Создать новый связанный сервер путем программирования | Используйте системную хранимую процедуру sp_addlinkedserver. |
| Удалить связанный сервер посредством программирования | Используйте системную хранимую процедуру sp_dropserver. |
| Часто выполнять запросы к удаленному ресурсу посредством отправки транзитного запроса | Определите связанный сервер и используйте функцию OPENQUERY. |
| Часто выполнять запросы к удаленным ресурсам посредством ссылки на объект с использованием четырехкомпонентного имени | Определите связанный сервер и используйте идентификатор связанного сервера в качестве компонента <ИмяСервера> полного уточненного имени. |
| Часто выполнять инструкции DDL и хранимые процедуры в отношении удаленного ресурса | Определите связанный сервер и используйте конструкцию EXECUTE…AT. |
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.