delphi使用MS Sql Server数据库的分布式查询

目录

delphi使用MS Sql Server数据库的分布式查询

一、链接服务器

1.1、简单的链接服务器

1.2、含多数据库架构的全链接服务器

1.3、链接服务器的理论与总结

                语法:

                参数:

                本系统存储过程的返回代码值:

                结果集:

                说明:

                权限:

                案例:

                                A. 使用用于 SQL Server 的 Microsoft OLE DB 提供程序

                                                使用用于 SQL Server 的 OLE DB 创建链接服务器

                                                在 SQL Server 的实例上创建链接服务器

                                B. 使用用于 Jet 的 Microsoft OLE DB 提供程序

                                C. 使用用于 Oracle 的 Microsoft OLE DB 提供程序

                                D. 将 data_source 参数与用于 ODBC 的 Microsoft OLE DB 提供程序一起使用

                                E. 将 provider_string 参数与用于 ODBC 的 Microsoft OLE DB 提供程序一起使用

                                F. 在 Excel 电子表格上使用用于 Jet 的 Microsoft OLE DB 提供程序

                                G. 使用用于检索服务的 Microsoft OLE DB 提供程序

                                H. 使用用于 Jet 的 Microsoft OLE DB 提供程序访问文本文件

                                I. 使用用于 DB2 的 Microsoft OLE DB 提供程序

二、分布式数据查询

2.1、开放数据源

                2.1.1、OpenDataSource函数

                                2.1.1.1、使用ACE.OLEDB数据引擎

                                2.1.1.2、使用Jet.OLEDB数据引擎

2.2、开放XML

                2.2.1、使用 OPENXML 编写 XML

                                2.2.1.1、使用sp_xml_preparedocument

                                2.2.1.2、使用sp_xml_removedocument

                2.2.2、使用 OPENXML

                2.2.3、示例

                                A.使用带有 OPENXML 的 SELECT 语句。

                                B. 为列和 XML 特性之间的映射指定 ColPattern

                                C. 获得边缘表格式的结果

三、依赖性-运行“链接服务器”和“分布式查询”有依赖性吗?

3.1、“链接服务器”和“分布式查询”相互之间并无直接的依赖性

                3.1.1、“链接服务器”和“分布式查询”,各自独立,两者之间无必须的依赖性

                3.1.2、“分布式查询”当涉及到数据源无法直接访问时:才需要先建立和调用“链接服务器”

3.2、“链接服务器”自身的依赖性

                3.2.1、MSDTC

                                3.2.1.1、MSDTC  : Distributed Transaction Coordinator (微软分布式传输协调器)

                                3.2.1.2、MSDTC指向C:\Windows\System32\msdtc.exe

                                         3.2.1.3、MSDTC的易懂解释:

                                         3.2.1.4、如何在 Windows Server 2012/2012R2 中配置 MSDTC,令其使用特定端口: 

                                         3.2.1.5、启停MSDTC         

                                         3.2.1.6、MSDTC配置      

3.3、“分布式查询”的依赖性

                3.3.1、OpenDataSource函数

                3.3.2、OpenRowSet函数

                3.3.3、OpenQuery函数

                3.3.4、OpenXML函数

                3.3.5、如果在对上述函数引用的内部参数中,需要指向无法直接访问的数据源或数据库对象,则需要链接服务器来配合调用。

                 3.3.6、如果你的应用依赖的Sql Server在客户端一体,对安全性有特别要求,请使用高版本的MS Sql Server,它们和操作系统一起都内置了强密码的安全策略。

本博客相关:

喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享:


delphi使用MS Sql Server数据库的分布式查询

一、链接服务器

1.1、简单的链接服务器

EXEC sp_addlinkedserver   '119.29.5.138' , 'SQL Server' 
-- :建立连接服务器  第一步建立连接  IP方式来控制  (需要验证用户名、密码的参数)
go
-- :查看链接服务器信息  [测试连接成功]
select *
from Carveout.dbo.sdd02020  -- 多数据库架构
go


        又如:

1.2、含多数据库架构的全链接服务器

EXEC sp_addlinkedserver   '81.69.222.207' , 'SQL Server' --  (需要验证用户名、密码的参数)
go
select top 10 * from [81.69.222.207].Carveout.dbo.sdf00504  --全链接架构名,只适用于Sql Server 2005及其以上
go

        架构是形成单个命名空间的数据库实体的集合。命名空间是一个集合,其中每个元素的名称都是唯一的。 例如,为了避免名称冲突,同一架构中不能有两个同名的数据库对象。两个表只有在位于不同的架构中时才可以同名,比如本例物理表sdf00504在数据库Carveout后对应dbo,dbo是系统默认的架构名。如果你的本地装有多个数据库实例,就可以通过类似【dbo】来区分。
        添加链接服务器后,若需修改其属性:

  • 【配置链接服务器属性】: sp_serveroption为远程服务器RDS和链接服务器LDS设置服务器选项
  • 【语法】:  sp_serveroption [@server =] 'server',[@optname =] 'option_name',[@optvalue =] 'option_value'

        这样,就可以直接来查询远程服务器上数据啦!

        添加链接服务器后,若需删除链接服务器:

-- sp_droplinkedsrvlogin '删除链接服务器登录名映射' [,预删除的登录的映射]
exec sp_droplinkedsrvlogin '81.69.222.207' ,NULL 
  -- 如果为 NULL,那么将会删除由 sp_addlinkedserver 创建的默认映射 [第二个参数]
--exec sp_dropserver '81.69.222.207' --[删除远程服务器81.69.222.207以及所有相关的远程登录。]
  -- :千万小心用:从本地 Microsoft® SQL Server™ 上的已知远程和链接服务器列表中删除服务器
exec  sp_helpserver
    -- 查看服务器状态的帮助信息,包含:name,network_name,status,id,collation_name,connect_timeout,query_timeout
    -- :即:服务器本地名[及其远程的链接服务器名],网络名,rpc协议[数据访问及使用远程整理],服务器的id号,整理名,连接超时,查询超时

1.3、链接服务器的理论与总结

sp_addlinkedserver

        创建一个链接的服务器,使其允许对分布式的、针对 OLE DB 数据源的异类查询进行访问。在使用 sp_addlinkedserver 创建链接的服务器之后,此服务器就可以执行分布式查询。如果链接服务器定义为 Microsoft® SQL Server™,则可执行远程存储过程

                语法:

sp_addlinkedserver [ @server = ] 'server'
    [ , [ @srvproduct = ] 'product_name' ]
    [ , [ @provider = ] 'provider_name' ]
    [ , [ @datasrc = ] 'data_source' ]
    [ , [ @location = ] 'location' ]
    [ , [ @provstr = ] 'provider_string' ]
    [ , [ @catalog = ] 'catalog' ]

                参数:

[ @server = ] 'server'

要创建的链接服务器的本地名称,server 的数据类型为 sysname,没有默认设置。

如果有多个 SQL Server 实例,server 可以为 servername\instancename。此链接的服务器可能会被引用为下面示例的数据源:

SELECT *FROM    [servername\instancename.]pubs.dbo.authors. 

如果未指定 data_source,则服务器为该实例的实际名称。

[ @srvproduct = ] 'product_name'

要添加为链接服务器的 OLE DB 数据源的产品名称。product_name 的数据类型为 nvarchar(128),默认设置为 NULL。如果是 SQL Server,则不需要指定 provider_namedata_sourcelocationprovider_string 以及目录。

[ @provider = ] 'provider_name'

与此数据源相对应的 OLE DB 提供程序的唯一程序标识符 (PROGID)。provider_name 对于安装在当前计算机上指定的 OLE DB 提供程序必须是唯一的。provider_name 的数据类型为nvarchar(128),默认设置为 NULL。OLE DB 提供程序应该用给定的 PROGID 在注册表中注册。

[ @datasrc = ] 'data_source'

由 OLE DB 提供程序解释的数据源名称。data_source 的数据类型为 nvarchar(4000),默认设置为 NULL。data_source 被当作 DBPROP_INIT_DATASOURCE 属性传递以便初始化 OLE DB 提供程序。

当链接的服务器针对于 SQL Server OLE DB 提供程序创建时,可以按照 servername\instancename 的形式指定 data_source,它可以用来连接到运行于特定计算机上的 SQL Server 的特定实例上。servername 是运行 SQL Server 的计算机名称,instancename 是用户将被连接到的特定 SQL Server 实例的名称。

[ @location = ] 'location'

OLE DB 提供程序所解释的数据库的位置。location 的数据类型为 nvarchar(4000),默认设置为 NULL。location 作为 DBPROP_INIT_LOCATION 属性传递以便初始化 OLE DB 提供程序。

[ @provstr = ] 'provider_string'

OLE DB 提供程序特定的连接字符串,它可标识唯一的数据源。provider_string 的数据类型为 nvarchar(4000),默认设置为 NULL。Provstr 作为 DBPROP_INIT_PROVIDERSTRING 属性传递以便初始化 OLE DB 提供程序。

当针对 Server OLE DB 提供程序提供了链接服务器后,可将 SERVER 关键字用作 SERVER=servername\instancename 来指定实例,以指定特定的 SQL Server 实例。servername 是 SQL Server 在其上运行的计算机名称,instancename 是用户连接到的特定的 SQL Server 实例名称。

[ @catalog = ] 'catalog'

建立 OLE DB 提供程序的连接时所使用的目录。catalog 的数据类型为sysname,默认设置为 NULL。catalog 作为 DBPROP_INIT_CATALOG 属性传递以便初始化 OLE DB 提供程序。

                本系统存储过程的返回代码值:

0(成功)或 1(失败)

                结果集:

如果没有指定参数,则 sp_addlinkedserver 返回此消息:

Procedure 'sp_addlinkedserver' expects parameter '@server', which was not supplied.

使用适当 OLE DB 提供程序和参数的 sp_addlinkedserver 返回此消息:

Server added.

                说明:

下表显示为可通过 OLE DB 访问的数据源设置链接服务器的方法。对于给定的数据源,可以使用多种方法为其设置链接服务器,下表中可能有不止一行适用于一种数据源类型。下表也显示了用于设置链接服务器的 sp_addlinkedserver 参数值。

远程 OLE DB 数据源
OLE DB
提供程序

product_name

provider_name

data_source


location

provider_string


catalog
SQL Server 用于 SQL Server 的 Microsoft OLE DB 提供程序 SQL Server (1)(默认值) - - - - -
SQL Server 用于 SQL Server 的 Microsoft OLE DB 提供程序 SQL Server SQLOLEDB SQL Server 的网络名称(用于默认实例) - - 数据库名称(可选)
SQL Server 用于 SQL Server 的 Microsoft OLE DB 提供程序 - SQLOLEDB 服务器名\实例名(对于特定实例) - - 数据库名称(可选)
Oracle 用于 Oracle 的 Microsoft OLE DB 提供程序 任何 (2) MSDAORA 用于 Oracle 数据库的 SQL*Net 别名 - - -
Access/
Jet
用于 Jet 的 Microsoft OLE DB 提供程序 任何 Microsoft.Jet.OLEDB.4.0 Jet 数据库文件的完整路径名 - - -
ODBC 数据源 用于 ODBC 的 Microsoft OLE DB 提供程序 任何 MSDASQL ODBC 数据源的系统 DSN - - -
ODBC 数据源 用于 ODBC 的 Microsoft OLE DB 提供程序 任何 MSDASQL - - ODBC 连接字符串 -
文件系统 用于索引服务的 Microsoft OLE DB 提供程序 任何 MSIDXS 索引服务目录名称 - - -
Microsoft Excel 电子表格 用于 Jet 的 Microsoft OLE DB 提供程序 任何 Microsoft.Jet.OLEDB.4.0 Excel 文件的完整路径名 - Excel 5.0 -
IBM DB2 数据库 用于 DB2 的Microsoft OLE DB 提供程序 任何 DB2OLEDB - - 请参见用于 DB2 文档的 Microsoft OLE DB 提供程序 DB2 数据库的目录名

(1 ) 这种设置链接服务器的方式强制链接服务器的名称与远程 SQL Server 的网络名称相同。使用 server 指定服务器。
(2 ) "任何"指产品名称可以任意。

data_sourcelocationprovider_stringcatalog 参数标识链接服务器指向的数据库。如果任一参数为 NULL 值,则不设置相应的 OLE DB 初始化属性。

说明  若要在 SQL Server 6.x 版上使用 SQL Server 2000 版的 Microsoft OLE DB 提供程序,请在 6.x 版 SQL Server 上运行 \Microsoft SQL Server\Install\Instcat.sql 脚本。此脚本对于在 SQL Server 6.x 服务器上运行分布式查询是基本的。

在群集环境中,当指定指向 OLE DB 数据源的文件名时,应使用通用命名规则 (UNC) 名称或共享驱动器指定位置。

                权限:

执行许可权限默认授予 sysadmin setupadmin 固定服务器角色的成员。

                案例:

                                A. 使用用于 SQL Server 的 Microsoft OLE DB 提供程序

                                                使用用于 SQL Server 的 OLE DB 创建链接服务器

下面的示例创建一台名为 SEATTLESales 的链接服务器,该服务器使用用于 SQL Server 的 Microsoft OLE DB 提供程序。

USE master
GO
EXEC sp_addlinkedserver 
    'SEATTLESales',
    N'SQL Server'
GO

                                                在 SQL Server 的实例上创建链接服务器

此示例在 SQL Server 的实例上创建一台名为 S1_instance1 的链接服务器,该服务器使用 SQL Server 的 Microsoft OLE DB 提供程序。

EXEC    sp_addlinkedserver    @server='S1_instance1', @srvproduct='',
                                @provider='SQLOLEDB', @datasrc='S1\instance1'

                                B. 使用用于 Jet 的 Microsoft OLE DB 提供程序

此示例创建一台名为 SEATTLE Mktg 的链接服务器。

说明  本示例假设已经安装 Microsoft Access 和示例 Northwind 数据库,且 Northwind 数据库驻留在 C:\Msoffice\Access\Samples。

USE master
GO
-- 使用命名参数集(named parameters):
EXEC sp_addlinkedserver 
   @server = 'SEATTLE Mktg', 
   @provider = 'Microsoft.Jet.OLEDB.4.0', 
   @srvproduct = 'OLE DB Provider for Jet',
   @datasrc = 'C:\MSOffice\Access\Samples\Northwind.mdb'
GO
-- 若不使用命名参数集:
USE master
GO
EXEC sp_addlinkedserver 
   'SEATTLE Mktg', 
   'OLE DB Provider for Jet',
   'Microsoft.Jet.OLEDB.4.0', 
   'C:\MSOffice\Access\Samples\Northwind.mdb'
GO

                                C. 使用用于 Oracle 的 Microsoft OLE DB 提供程序

此示例创建一台名为 LONDON Mktg 的链接服务器,该服务器使用用于 Oracle 的 Microsoft OLE DB 提供程序,并且假设此 Oracle 数据库的 SQL*Net 别名为 MyServer

USE master
GO
-- To use named parameters:
EXEC sp_addlinkedserver
   @server = 'LONDON Mktg',
   @srvproduct = 'Oracle',
   @provider = 'MSDAORA',
   @datasrc = 'MyServer'
GO
-- OR to use no named parameters:
USE master
GO
EXEC sp_addlinkedserver 
   'LONDON Mktg', 
   'Oracle', 
   'MSDAORA',
   'MyServer'
GO

                                D. 将 data_source 参数与用于 ODBC 的 Microsoft OLE DB 提供程序一起使用

此示例创建一台名为 SEATTLE Payroll 的链接服务器,该服务器使用用于 ODBC 的 Microsoft OLE DB 提供程序和 data_source 参数。

说明  在执行 sp_addlinkedserver 之前,必须在服务器上将指定的 ODBC 数据源名称定义为系统 DSN。

USE master
GO
-- To use named parameters:
EXEC sp_addlinkedserver 
   @server = 'SEATTLE Payroll', 
   @provider = 'MSDASQL', 
   @datasrc = 'LocalServer'
GO
-- OR to use no named parameters:
USE master
GO
EXEC sp_addlinkedserver 
   'SEATTLE Payroll', 
   '', 
   'MSDASQL',
   'LocalServer'
GO

                                E. 将 provider_string 参数与用于 ODBC 的 Microsoft OLE DB 提供程序一起使用

此示例创建一台名为 LONDON Payroll 的链接服务器,该服务器使用用于 ODBC 的 Microsoft OLE DB 提供程序和 provider_string 参数。

说明  有关 ODBC 连接字符串的更多信息,应当搜寻 SQLDriverConnect

USE master
GO
-- To use named parameters:
EXEC sp_addlinkedserver 
   @server = 'LONDON Payroll', 
   @provider = 'MSDASQL',
   @provstr = 'DRIVER={SQL Server};SERVER=MyServer;UID=sa;PWD=;'
GO
-- OR to use no named parameters:
USE master
GO
EXEC sp_addlinkedserver 
   'LONDON Payroll', 
   '', 
   'MSDASQL',
   NULL,
   NULL,
   'DRIVER={SQL Server};SERVER=MyServer;UID=sa;PWD=;'
GO

                                F. 在 Excel 电子表格上使用用于 Jet 的 Microsoft OLE DB 提供程序

若要创建使用用于 Jet 的 Microsoft OLE DB 提供程序以访问 Excel 电子表格的链接服务器定义,请首先在 Excel 中创建一个命名的范围以指定要在 Excel 工作表中选择的行和列。然后,可将此范围的名称引用为分布式查询中的表名称。

EXEC sp_addlinkedserver 'ExcelSource',
   'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   'c:\MyData\DistExcl.xls',
   NULL,
   'Excel 5.0'
GO

为了访问 Excel 电子表格中的数据,请将某个范围内的单元与某个名称相关联。通过将范围的名称用作表名称,可以访问指定的已命名范围。下列查询利用前面设置的链接服务器,可访问称为 SalesData 的命名范围。

SELECT *
FROM EXCEL...SalesData
GO

                                G. 使用用于检索服务的 Microsoft OLE DB 提供程序

此示例创建一台链接服务器,并且使用 OPENQUERY 从为检索服务启用的链接服务器和文件系统中检索信息。

EXEC sp_addlinkedserver FileSystem,
   'Index Server',
   'MSIDXS',
   'Web'
GO
USE pubs
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'yEmployees')
   DROP TABLE yEmployees
GO
CREATE TABLE yEmployees
 (
  id       int         NOT NULL,
  lname    varchar(30) NOT NULL,
  fname    varchar(30) NOT NULL,
  salary   money,
  hiredate datetime
 )
GO
INSERT yEmployees VALUES
 ( 
  10,
  'Fuller',
  'Andrew',
  $60000,
  '9/12/98'
 )
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
      WHERE TABLE_NAME = 'DistribFiles')
   DROP VIEW DistribFiles
GO
CREATE VIEW DistribFiles 
 AS
 SELECT *
 FROM OPENQUERY(FileSystem,
                 'SELECT Directory, 
                    FileName,
                    DocAuthor,
                    Size,
                    Create,
                    Write
                  FROM SCOPE('' "c:\My Documents" '')
                  WHERE CONTAINS(''Distributed'') > 0 
                    AND FileName LIKE ''%.doc%'' ')
 WHERE DATEPART(yy, Write) = 1998
GO
SELECT * 
FROM DistribFiles
GO
SELECT Directory,
  FileName, 
  DocAuthor, 
  hiredate
FROM DistribFiles D, yEmployees E
WHERE D.DocAuthor = E.FName + ' ' + E.LName
GO

                                H. 使用用于 Jet 的 Microsoft OLE DB 提供程序访问文本文件

此示例创建一台直接访问文本文件的链接服务器,而没有将这些文件链接为 Access .mdb 文件中的表。提供程序是 Microsoft.Jet.OLEDB.4.0,提供程序字符串为"Text"。

数据源是包含文本文件的目录的完整路径名。schema.ini 文件(描述文本文件的结构)必须与此文本文件存在于相同的目录中。有关创建 schema.ini 文件的更多信息,请参见 Jet 数据库引擎文档。

--Create a linked server
EXEC sp_addlinkedserver txtsrv, 'Jet 4.0', 
   'Microsoft.Jet.OLEDB.4.0',
   'c:\data\distqry',
   NULL,
   'Text'
GO

--Set up login mappings
EXEC sp_addlinkedsrvlogin txtsrv, FALSE, Admin, NULL
GO

--List the tables in the linked server
EXEC sp_tables_ex txtsrv
GO

--Query one of the tables: file1#txt
--using a 4-part name 
SELECT * 
FROM txtsrv...[file1#txt]

                                I. 使用用于 DB2 的 Microsoft OLE DB 提供程序

下面的示例创建一台名为 DB2 的链接服务器,该服务器使用用于 DB2 的 Microsoft OLE DB 提供程序。

EXEC sp_addlinkedserver
   @server='DB2',
   @srvproduct='Microsoft OLE DB Provider for DB2',
   @catalog='DB2',
   @provider='DB2OLEDB',
   @provstr='Initial Catalog=PUBS;Data Source=DB2;HostCCSID=1252;Network Address=XYZ;Network Port=50000;Package Collection=admin;Default Schema=admin;'

二、分布式数据查询

2.1、开放数据源

                2.1.1、OpenDataSource函数

                                2.1.1.1、使用ACE.OLEDB数据引擎

-- ACE.OLEDB若用于Excel导入导出,适用于所有Excel版本,但需要使用不同的扩展属性参数: 

-- ACE.OLEDB若用于Excel导入导出,适用于所有Excel版本,但需要使用不同的扩展属性参数:

--Excel2003以上版本:
insert into OPENDATASOURCE ('Microsoft.ACE.OLEDB.12.0',
    'Data Source=D:\开发包\饲料分批次进销存-存货计价和条码\A1.xlsx;Extended Properties=Excel 12.0 Xml;Persist Security Info=False'
)...[A1$](公司编码,行种子,产品编码,销量下限,销量上限,现场折扣,其它扣率,备注)
select com_id,seeds_id,item_id,sd_oq_LowerLimit,sd_oq_UpperLimit,send_sum,send_sum_other,c_memo 
from Siliao_jxc_BarcodeStock.dbo.Ctl03001_DiscountTemp
go

--Excel2003及其以下:
insert into OPENDATASOURCE ('Microsoft.ACE.OLEDB.12.0',
    'Data Source=D:\开发包\饲料分批次进销存-存货计价和条码\A1.xls;Extended Properties=Excel 8.0;Persist Security Info=False'
)...[A1$](公司编码,行种子,产品编码,销量下限,销量上限,现场折扣,其它扣率,备注)
select com_id,seeds_id,item_id,sd_oq_LowerLimit,sd_oq_UpperLimit,send_sum,send_sum_other,c_memo 
from Siliao_jxc_BarcodeStock.dbo.Ctl03001_DiscountTemp
go

insert into OPENDATASOURCE ('Microsoft.ACE.OLEDB.12.0',
    'Data Source=D:\开发包\饲料分批次进销存-存货计价和条码\Book1.xlsx;Extended Properties=Excel 12.0 Xml;Persist Security Info=False'
)...[Sheet1$](公司编码,行种子,产品编码,销量下限,销量上限,现场折扣,其它扣率,备注)
select com_id,seeds_id,item_id,sd_oq_LowerLimit,sd_oq_UpperLimit,send_sum,send_sum_other,c_memo 
from Siliao_jxc_BarcodeStock.dbo.Ctl03001_DiscountTemp
go

SELECT *
FROM OPENDATASOURCE ('Microsoft.ACE.OLEDB.12.0',
    'Data Source=D:\开发包\饲料分批次进销存-存货计价和条码\A1.xlsx;Extended Properties=Excel 12.0 Xml;Persist Security Info=False'
)...[A1$] 
go

SELECT   *
FROM      OPENDATASOURCE(
         'SQLOLEDB',--SQLOLEDB
         'Data Source=119.29.5.138;User ID=sa;Password='
         ).Carveout.dbo.View_sdd02020  --View_sdd02020  sdd02021
go
SELECT   *
FROM      OPENDATASOURCE(
         'SQLOLEDB',--SQLOLEDB :慢、效率低
         'Data Source=81.69.222.207;User ID=sa;Password='
         ).Carveout.dbo.View_sdd02020  --View_sdd02020  sdd02021
go

                                2.1.1.2、使用Jet.OLEDB数据引擎

        -- Jet.OLEDB若用于Excel导入导出,只适用于Excel 2003及其以下版本:  

-- Jet.OLEDB若用于Excel导入导出,只适用于Excel 2003及其以下版本:

SELECT * 
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
  'Data Source="D:\开发包\饲料分批次进销存-存货计价和条码\A1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0'
)...[A1$] 
go 

2.2、开放XML

                2.2.1、使用 OPENXML 编写 XML

OPENXML 是在内存中的 XML 文档上提供行集的 Transact-SQL 关键字。OPENXML 是与表或视图相似的行集提供程序。OPENXML 通过提供 XML 文档内部表示法的行集视图,允许访问 XML 数据,就好象它是关系行集一样。行集中的记录可以存储在数据库表中(类似于表和视图所提供的行集)。

无论行集提供程序(如表、视图或 OPENROWSET)可以在何处作为源出现,都可以在 SELECT 和 SELECT INTO 语句中使用 OPENXML。有关 OPENXML 语法的信息,请参见 OPENXML。

若要使用 OPENXML 编写对 XML 文档的查询,首先必须调用 sp_xml_preparedocument,以分析 XML 文档并返回准备使用的已分析文档的句柄。已分析文档是 XML 文档中各种节点(元素、特性、文本、注释等等)的树型表示法。文档句柄传递到 OPENXML,然后 OPENXML 根据传递给它的参数提供文档的行集视图。

必须通过调用 sp_xml_removedocument 系统存储过程释放内存,以将 XML 文档的内部表示法从内存中删除。

下图说明了此过程。

说明  若要理解 OPENXML,需要熟悉 XPath 查询并理解 XML。有关 Microsoft® SQL Server™ 2000 XPath 支持的更多信息,请参见使用 XPath 查询。

OPENXML 参数

OPENXML 的参数包括:

  • XML 文档句柄 (idoc)


     
  • 标识要映射到行的节点的 XPath 表达式 (rowpattern)


     
  • 对要生成的行集的描述


     
  • 行集列和 XML 节点之间的映射

XML 文档句柄 (idoc)

sp_xml_preparedocument存储过程返回此文档句柄。

XPath 表达式标识将要处理的节点 (rowpattern)

指定为 rowpattern 的 XPath 表达式标识 XML 文档中的节点集。rowpattern 标识的每个节点对应于 OPENXML 所生成的行集中的一行。

XPath 表达式标识的节点可以是 XML 文档中的任何 XML 节点(元素、特性、处理说明等)。如果 rowpattern 标识 XML 文档中的元素集,则所标识的每个元素节点在行集中都占一行。例如,如果 rowpattern 以特性结束,则将为 rowpattern 选定的每个特性节点创建一行。

描述将要生成的行集

必须向 OPENXML 提供行集架构以生成行集。可以使用可选的 WITH 子句指定行集架构。下列选项可用于指定行集架构:

  • 在 WITH 子句中指定完整的架构。

    在指定行集架构时,可指定列名和它们的数据类型,以及它们到 XML 文档的映射。

    可以指定列模式(使用 SchemaDeclaration 中的 ColPattern 参数)。指定的列模式用于将行集列映射到 rowpattern 所标识的 XML 节点并确定映射类型。

    如果没有为列指定 ColPattern,则行集列根据 flags 参数所指定的映射而映射到具有相同名称的 XML 节点。但是如果在 WITH 子句中将 ColPattern 指定为架构描述的一部分,则重写用 flags 参数指定的映射。

  • 在 WITH 子句中指定现有表名。

    可以很容易地指定现有的表名,而 OPENXML 可以使用该表的架构生成行集。

  • 不指定 WITH 子句。

    在这种情况下,OPENXML 以所谓的边缘表格式返回行集。称其为边缘表是因为采用这种表格式时,已分析的 XML 文档树中的每个边缘分别映射到行集中的一行。

    边缘表在单个表中表示 XML 文档的细密结构(例如,元素/特性名、文档层次结构、命名空间、处理说明等)。边缘表格式使您得以获得无法通过元属性表现的附加信息。有关元属性的更多信息,请参见在 OPENXML 中指定元属性

    边缘表提供的附加信息使您得以存储/查询元素/特性的数据类型、节点类型(元素节点、特性节点或值节点),存储/查询有关 XML 文档结构的信息,并有可能生成 XML 文档管理系统。

    边缘表使您得以编写存储过程,以将 XML 文档视为 BLOB 输入、生成边缘表,然后在最精细的级别上析取并分析文档(查找文档层次结构、元素/特性名、命名空间、处理说明等)。

    当映射到其它关系格式没有意义且 ntext 字段没有提供足够的结构信息时,边缘表还可以用作 XML 文档的存储格式。

    无论何时只要想以其它方式使用 XML 语法分析器检查 XML 文档,都可以使用边缘表获得相同的信息。

    下表描述边缘表的结构。

    列名 数据类型 描述
    id Bigint 是文档节点的唯一 ID。

    根元素的 ID 值为 0。保留负 ID 值。

    parentid Bigint 标识节点的父节点。此 ID 所标识的父节点不一定是父元素,而是取决于此 ID 所标识节点的子节点的 NodeType。例如,如果节点是文本节点,则其父节点可能是特性节点。

    如果节点位于 XML 文档的顶层,则其 ParentID 为 NULL。

    nodetype Int 标识节点类型。是对应于 XML DOM 节点类型编号的整数(有关节点信息,请参见 DOM)。

    某些节点类型为:

    1 = 元素节点
    2 = 特性节点
    3 = 文本节点

    localname nvarchar 给出元素或特性的本地名称。如果 DOM 对象没有名称则为 NULL。
    prefix nvarchar 是节点名称的命名空间前缀。
    namespaceuri nvarchar 是节点的命名空间 URI。如果值是 NULL,则命名空间不存在。
    datatype nvarchar 是元素或特性行的实际数据类型,否则是 NULL。从内嵌 DTD 中或从内嵌架构中推断数据类型。
    prev Bigint 是前一个兄弟元素的 XML ID。如果前面没有兄弟元素则为 NULL。
    text Ntext 包含文本格式的特性值或元素内容(如果边缘表项不需要值则为 NULL)。

行集列和 XML 节点之间的映射

在 OPENXML 语句中,可以选择指定行集列和 rowpattern 所标识的 XML 节点之间的映射类型(attribute-centric、element-centric)。此信息用于 XML 节点和行集列的相互转换。

有两种方法指定映射(可以同时指定两者):

  • 使用 flags 参数。

    flags 参数所指定的映射采用名称对应,即 XML 节点映射到同名的对应行集列。

  • 使用 ColPattern 参数。

    ColPattern 是 XPath 表达式,被指定为 WITH 子句中的 SchemaDeclaration 的一部分。在 ColPattern 中指定的映射重写 flags 参数所指定的映射。

    ColPattern 可用于指定映射的特殊性质(当映射为 attribute-centric 和 element-centric 时),以重写或增强 flags 所指定的默认映射。

    在下列情况下指定 ColPattern

    • 行集中的列名不同于它所映射到的元素/特性名。在这种情况下,ColPattern 用于识别行集列映射到的 XML 元素/特性名。


       
    • 希望将元属性特性映射到列。在这种情况下,ColPattern 用于标识行集列映射到的元属性。有关使用元属性的更多信息,请参见在 OPENXML 中指定元属性

flagsColPattern 参数都是可选的。如果没有指定映射,则默认情况下使用 attribute-centric 映射(flags 参数的默认值)。

Attribute-centric(以特性为中心的)映射

如果将 OPENXML 中的 flags 参数设置为特性,则特性基于名称对应映射到行集中的列。名称对应表示每个给定名称的 XML 特性都以相同的名称存储在行集中的列内。

如果列名不同于它所映射到的特性名,则必须指定 ColPattern

如果 XML 特性具有命名空间限定符,则行集中的列名也必须有此限定符。

Element-centric(以元素为中心的)映射

将 OPENXML 中的 flags 参数设置为 2 (XML_ELEMENTS) 将指定 element-centric 映射。除了下列差异外,它与 attribute-centric 映射相似:

  • 除非指定列级模式,否则映射的名称对应(例如,映射到同名 XML 元素的列)选择不复杂的子元素。在检索的情况下,如果子元素是复杂的(包含深一层的子元素),则将列设置为 NULL。忽视子元素的特性值。


     
  • 具有相同名称的多个子元素将以检索顺序相互重写。在名称相同的情况下,联接父元素将追加子元素。

                                2.2.1.1、使用sp_xml_preparedocument

 
sp_xml_preparedocument
读取作为输入提供的可扩展标记语言 (XML) 文本,然后使用 MSXML 语法分析器 (Msxml2.dll) 对其进行分析,并提供分析后的文档供您使用。分析后的文档是 XML 文档中各节点(元素、特性、文本、注释等)的树型表示法。 

sp_xml_preparedocument 返回一个句柄,可用于访问 XML 文档的新创建的内部表示方式。该句柄在连接到 Microsoft® SQL Server™ 2000 期间保持有效,直到重置连接或执行 sp_xml_removedocument 使句柄无效为止。



说明  分析过的文档存储在 SQL Server 2000 的内部高速缓存中。MSXML 语法分析器使用 SQL Server 可用总内存的八分之一。若要避免内存不足,请运行 sp_xml_removedocument 以释放内存。


语法
sp_xml_preparedocument hdoc OUTPUT
[, xmltext]
[, xpath_namespaces]

参数
hdoc

是新创建的文档的句柄。hdoc 的数据类型为 integer。

[xmltext]

是原 XML 文档。MSXML 语法分析器分析该 XML 文档。xmltext 是 text 类型(char、nchar、varchar、nvarchar、text 或 ntext)的参数。默认值是 NULL,在这种情况下,将创建空 XML 文档的内部表示法。

[xpath_namespaces]

指定 OPENXML 的行和列 XPath 表达式中所使用的命名空间声明。默认值是 <root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop">。
xpath_namespaces 通过符合语法规则的 XML 文档的方式,为在 OPENXML 的 Xpath 表达式中使用的前缀提供命名空间 URI。xpath_namespaces 声明前缀必须用于引用命名空间 urn:schemas-microsoft-com:xml-metaprop,该命名空间提供有关分析后的 XML 元素的元数据。尽管可以使用此方法为元属性命名空间重新定义命名空间前缀,但此命名空间不会丢失。此前缀 mp 对 urn:schemas-microsoft-com:xml-metaprop 仍有效,即使 xpath_namespaces 不包含此类声明。xpath_namespaces 是 text 类型(char、nchar、varchar、nvarchar、text 或 ntext)的参数。 

返回代码值
0(成功)或 >0(失败)

权限
执行权限默认授予 public 角色。

示例
A. 为符合语法规则的 XML 文档准备内部表示方式
下例返回作为输入提供的新创建的 XML 文档内部表示法的句柄。在对 sp_xml_preparedocument 的调用中,使用了默认命名空间前缀映射。

DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
-- Remove the internal representation.
exec sp_xml_removedocument @hdoc

B. 为带 DTD 的符合语法规则的 XML 文档准备内部表示方式
下例返回作为输入提供的新创建的 XML 文档内部表示法的句柄。存储过程根据文档中包含的 DTD 来验证装载的文档。在对 sp_xml_preparedocument 的调用中,使用了默认命名空间前缀映射。

DECLARE @hdoc int
DECLARE @doc varchar(2000)
SET @doc = '
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE root 
[<!ELEMENT root (Customers)*>
<!ELEMENT Customers EMPTY>
<!ATTLIST Customers CustomerID CDATA #IMPLIED ContactName CDATA #IMPLIED>]>
<root>
<Customers CustomerID="ALFKI" ContactName="Maria Anders"/>
</root>'

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc

C. 指定命名空间 URI
下例返回作为输入提供的新创建的 XML 文档内部表示法的句柄。在对 sp_xml_preparedocument 的调用中,保留了元属性命名空间映射的 mp 前缀,并将 xyz 映射前缀添加到了命名空间 urn:MyNamespace。

DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5" 
           OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3" 
           OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc, '<root xmlns:xyz="run:MyNamespace"/>'

                                2.2.1.2、使用sp_xml_removedocument


sp_xml_removedocument
删除文档句柄指定的 XML 文档的内部表示方式并使该文档句柄无效。


说明  分析过的文档保存在 Microsoft® SQL Server™ 2000 的内部高速缓存中。MSXML 语法分析器使用 SQL Server 可用总内存的八分之一。若要避免内存不足,请运行 sp_xml_removedocument 以释放内存。

语法
sp_xml_removedocument hdoc

参数
hdoc

是新创建的文档的句柄。无效句柄返回错误。hdoc 的数据类型为 integer。

返回代码值
0(成功)或 >0(失败)

权限
执行权限默认授予 public 角色。

示例
A. 删除 XML 文档
下例删除 XML 文档的内部表示法。该文档的句柄作为输入提供。

EXEC sp_xml_removedocument @hdoc

                2.2.2、使用 OPENXML

OPENXML
OPENXML 通过 XML 文档提供行集视图。由于OPENXML 是行集提供程序,因此可在会出现行集提供程序(如表、视图或 OPENROWSET 函数)的 Transact-SQL 语句中使用 OPENXML。

语法
OPENXML(idoc int [in],rowpattern nvarchar[in],[flags byte[in]]) 
[WITH (SchemaDeclaration | TableName)]

参数
idoc

是 XML 文档的内部表式法的文档句柄。通过调用 sp_xml_preparedocument 创建 XML 文档的内部表式法。

rowpattern

是 XPath 模式,用来标识要作为行处理的节点(这些节点在 XML 文档中,该文档的句柄由 idoc 参数传递)。

flags

表示应在 XML 数据和关系行集间使用映射以及应如何填充溢出列。flag 为可选输入参数,可以是下列值之一。

字节值
描述
0 默认为以特性为中心的映射。
1 使用以特性为中心的映射。
在某些情况下,可以将它与 XML_ELEMENTS 组合使用。使用时首先应用以特性为中心的映射,然后对于所有仍未处理的列应用以元素为中心的映射。
2 使用以元素为中心的映射。
在某些情况下,可以将它与 XML_ATTRIBUTES 组合使用。使用时先应用以特性为中心的映射,然后对于所有仍未处理的列应用以元素为中心的映射。
8 可与 XML_ATTRIBUTES 或 XML_ELEMENTS 组合使用(逻辑 OR)。
在检索的上下文中,该标志指明不应将已消耗的数据复制到溢出属性 @mp:xmltext
SchemaDeclaration

是窗体的架构定义:
ColName ColType [ColPattern | MetaProperty][, ColName ColType [ColPattern | MetaProperty]...] 

ColName 
是行集中的列名。

ColType 
是行集中列的 SQL 数据类型。如果列类型不同于特性的基础 XML 数据类型,那么将发生类型压制。如果列的类型是 TIMESTAMP,则当从 OPENXML 行集中进行选择时,将忽略 XML 文档中现有的值并返回自动填充值。

ColPattern 
是可选的通用 XPath 模式,它说明应如何将 XML 节点映射到列。如果没有指定 ColPattern,那么发生默认的映射(由 flags 指定的以特性为中心或以元素为中心的映射)。 
指定为 ColPattern 的 XPath 模式用于指定特殊的映射性质(如果发生以特性为中心和以元素为中心的映射),这些特殊的映射性质可以重写或增强由标志所指定的默认映射。 

指定为 ColPattern 的通用 XPath 模式也支持元属性。 


MetaProperty 
是由 OPENXML 提供的元属性之一。如果指定元属性,则该列包含元属性提供的信息。这些元属性使您得以析取 XML 节点的信息(如相对位置、命名空间信息),以提供比文本化表示法更详细的信息。 
TableName

如果具有期望架构的表已经存在且不要求列模式,则为给定的表名(而不是 SchemaDeclaration)。

通过使用 SchemaDeclaration 或者指定一个现有的 TableName,WITH 子句提供一种行集格式(根据需要还提供其它映射信息)。如果没有指定可选的 WITH 子句,那么以 edge table 格式返回结果。边缘表在单个表中表示 XML 文档的细密结构(例如,元素/特性名、文档层次结构、命名空间、PI 等)。

下表描述边缘表的结构:

下表描述边缘表的结构:

列名 数据类型 描述
id bigint 是文档节点的唯一 ID。

根元素的 ID 值为 0。保留负 ID 值。

parentid bigint 标识节点的父节点。此 ID 所标识的父节点不一定是父元素,而是取决于此 ID 所标识节点的子节点的 NodeType。例如,如果节点是文本节点,则其父节点可能是特性节点。

如果节点位于 XML 文档的顶层,则其 ParentID 为 NULL。

nodetype int 标识节点类型。是对应于 XML DOM 节点类型编号的整数(有关节点信息,请参见 DOM)。

三种节点类型是:

1 = 元素节点
2 = 特性节点
3 = 文本节点

localname nvarchar 给出元素或特性的本地名称。如果 DOM 对象没有名称则为 NULL。
prefix nvarchar 是节点名称的命名空间前缀。
namespaceuri nvarchar 是节点的命名空间 URI。如果值是 NULL,则命名空间不存在。
datatype nvarchar 是元素或特性行的实际数据类型,否则是 NULL。从内嵌 DTD 中或从内嵌架构中推断数据类型。
prev bigint 是前一个兄弟元素的 XML ID。如果前面没有兄弟元素则为 NULL。
text ntext 包含文本格式的特性值或元素内容(如果边缘表项不需要值则为 NULL)。

                2.2.3、示例

                                A.使用带有 OPENXML 的 SELECT 语句。

下面的示例使用 sp_xml_preparedocument 创建 XML 图像的内部表示。然后对 XML 文档的内部表示法执行使用 OPENXML 行集提供程序的 SELECT 语句。

flag 值设置为 1,表示以特性为中心的映射。因此,XML 特性映射到行集中的列。指定为 /ROOT/Customersrowpattern 标识要处理的 <Customers> 节点。

没有指定可选的 colpattern(列模式),因为列名和 XML 特性名称匹配。

OPENXML 行集提供程序创建了一个双列行集(CustomerID ContactName),SELECT 语句从该行集中检索必要的列(在本例中检索所有的列)。

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT    *
FROM       OPENXML (@idoc, '/ROOT/Customer',1)
            WITH (CustomerID  varchar(10),
                  ContactName varchar(20))

下面是结果集:

CustomerID ContactName          
---------- -------------------- 
VINET      Paul Henriot
LILAS      Carlos Gonzlez
如果将 flags 设置为 2(表示以元素为中心的映射)并执行相同的 SELECT 语句,由于 <Customers> 元素没有任何子元素,则对于 XML 文档中两个 Customer 的 CustomerID 和 ContactName 的值都作为 NULL 返回。

下面是结果集:

CustomerID ContactName
---------- -----------
NULL       NULL
NULL       NULL

                                B. 为列和 XML 特性之间的映射指定 ColPattern

下面的查询从 XML 文档返回客户 ID、订单日期、产品 ID 和数量等特性。rowpattern 标识 <OrderDetail> 元素。ProductIDQuantity 是 <OrderDetails> 元素的特性。而 CustomerIDOrderDate 是父元素 (<Orders>) 的特性。

指定可选的 ColPattern,表示:

  • 行集中的 OrderIDCustomerIDOrderDate 列映射到 XML 文档中 rowpattern 所标识节点的父节点的特性。
  • 行集中的 ProdID 列映射到 ProductID 特性,而行集中的 Qty 列映射到 rowpattern 所标识节点的 Quantity 特性。

尽管以元素为中心的映射由 flag 参数指定,但 ColPattern 中指定的映射重写该映射。

declare @idoc int
declare @doc varchar(1000)
set @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order OrderID="10248" CustomerID="VINET" EmployeeID="5" 
           OrderDate="1996-07-04T00:00:00">
      <OrderDetail ProductID="11" Quantity="12"/>
      <OrderDetail ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3" 
           OrderDate="1996-08-16T00:00:00">
      <OrderDetail ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
exec sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM   OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
         WITH (OrderID       int         '../@OrderID',
               CustomerID  varchar(10) '../@CustomerID',
               OrderDate   datetime    '../@OrderDate',
               ProdID      int         '@ProductID',
               Qty         int         '@Quantity')

结果如下:

OrderID CustomerID           OrderDate                 ProdID    Qty

------------------------------------------------------------------------

10248      VINET       1996-07-04 00:00:00.000   11      12
10248      VINET       1996-07-04 00:00:00.000   42      10
10283      LILAS       1996-08-16 00:00:00.000   72      3

                                C. 获得边缘表格式的结果

在下例中,在 OPENXML 语句中未指定 WITH 子句。因此,OPENXML 所生成的行集具有边缘表格式。SELECT 语句返回边缘表中的所有列。

下例中的示例 XML 文档由 <Customer>、<Order> 和 <Order_0020_Details> 元素组成。

首先调用 sp_xml_preparedocument 以获得文档句柄。此文档句柄传递到 OPENXML。

在 OPENXML 语句中

  • rowpattern (/ROOT/Customer) 标识要处理的 <Customer> 节点。
  • 未提供 WITH 子句。因此 OPENXML 以边缘表格式返回行集。

最后 SELECT 语句检索边缘表中的所有列。

declare @idoc int
declare @doc varchar(1000)
set @doc ='
<ROOT>
<Customers CustomerID="VINET" ContactName="Paul Henriot">
   <Orders CustomerID="VINET" EmployeeID="5" OrderDate=
           "1996-07-04T00:00:00">
      <Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/>
      <Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/>
   </Orders>
</Customers>
<Customers CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Orders CustomerID="LILAS" EmployeeID="3" OrderDate=
           "1996-08-16T00:00:00">
      <Order_x0020_Details OrderID="10283" ProductID="72" Quantity="3"/>
   </Orders>
</Customers>
</ROOT>'
--Create an internal representation of the XML document.
exec sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT statement using OPENXML rowset provider
SELECT    *
FROM       OPENXML (@idoc, '/ROOT/Customers')
EXEC sp_xml_removedocument @idoc

返回结果:边缘表。

三、依赖性-运行“链接服务器”和“分布式查询”有依赖性吗?

3.1、“链接服务器”和“分布式查询”相互之间并无直接的依赖性

                3.1.1、“链接服务器”和“分布式查询”,各自独立,两者之间无必须的依赖性

                3.1.2、“分布式查询”当涉及到数据源无法直接访问时:才需要先建立和调用“链接服务器”

3.2、“链接服务器”自身的依赖性

                3.2.1、MSDTC

                                3.2.1.1、MSDTC  : Distributed Transaction Coordinator (微软分布式传输协调器)

                                3.2.1.2、MSDTC指向C:\Windows\System32\msdtc.exe

         如上图,这下你应该知晓了。经常遇到提示你,类似:“iSAM”无效或不存在的真正的关键所在了吧?

                                         3.2.1.3、MSDTC的易懂解释:

         https://baike.baidu.com/item/msdtc/445435?fr=aladdin 

         https://support.microsoft.com/zh-cn/Search/results?query=MSDTC

                                         3.2.1.4、如何在 Windows Server 2012/2012R2 中配置 MSDTC,令其使用特定端口: 

         https://zhidao.baidu.com/question/617491654505541932.html

                                         3.2.1.5、启停MSDTC         

         开始->运行->cmd启动命令行(其实在Delphi等高级开发工具中,都可以直接用代码来调用的,不仅仅只限于下述这些命令行):

         直接启动服务: net start msdtc

         如果启动失败的话按下列步骤执行:
                在命令行输入services.msc  ,
                打开服务答管理器:找到Distributed Transaction Coordinator服务,并设置为手动,再启动服务。

         再不行的话在命令行中输入:

                  net stop msdtc

                  msdtc -uninstall

                  msdtc -install

                  net start msdtc

                                         3.2.1.6、MSDTC配置      

         Windows 7,Windows Server 2008 MSDTC配置:

                  DComCnfg.exe  (命令行执行组件服务) :

         Windows XP和Windows Server 2003下MSDTC的配置:

          唉,从事软件开发工作,不懂操作系统,那是硬伤呀,只能跟在开发工具屁股后面“冥思苦想”,殊不知直接调用操作系统如此简单,无论MSWindows、Android还是iOS。

3.3、“分布式查询”的依赖性

                3.3.1、OpenDataSource函数

                3.3.2、OpenRowSet函数

                3.3.3、OpenQuery函数

                3.3.4、OpenXML函数

                3.3.5、如果在对上述函数引用的内部参数中,需要指向无法直接访问的数据源或数据库对象,则需要链接服务器来配合调用。

                 3.3.6、如果你的应用依赖的Sql Server在客户端一体,对安全性有特别要求,请使用高版本的MS Sql Server,它们和操作系统一起都内置了强密码的安全策略。

         哪怕你是操作系统的超级管理员账户登录和Sql Server的管理员,也无权复制、查阅创建者设置Sql Server的用户密码,除非你删除此用户,而删除此用户,App也就不能再使用了。

本博客相关:

        1、《delphi导入导出Excel与Sql Server

       2、《delphi中TEdgeBrowser控件用法之一

喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享:

猜你喜欢

转载自blog.csdn.net/pulledup/article/details/110252304