我有一个用于生成 SOAP 文档的 TSQL 查询。我正在使用两个命名空间。即: - http://schemas.xmlsoap.org/soap/envelope/用于“打包”soap 文档 - 描述正文中包含的数据的自定义文档
目前,包括正文中的元素在内的每个元素都包含我不需要且想要的soapnamespace 引用,我只希望它位于根元素中。
所以我的 XML 现在看起来像
<soapenv:Envelope xmlns="soapenv" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pas="foobar">
<soapenv:Header xmlns="soapenv" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pas="foobar" />
<soapenv:Body xmlns="soapenv" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pas="foobar">
<pas:SomeObject xmlns="soapenv" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pas="foobar">
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像
<soapenv:Envelope xmlns="soapenv" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pas="foobar">
<soapenv:Header/>
<soapenv:Body>
<pas:SomeObject>
Run Code Online (Sandbox Code Playgroud)
在我当前使用的查询中
;WITH XMLNAMESPACES ( 'http://foobar' as pas,
'http://schemas.xmlsoap.org/soap/envelope/' as soapenv
)
SELECT (SELECT '' FOR XML PATH('soapenv:Header'),type ),
etc...
FOR XML PATH('soapenv:Envelope'), ELEMENTS
Run Code Online (Sandbox Code Playgroud) 我喜欢在旅途中查找丢失的索引,查看执行计划!
如果我想改进当前正在运行的东西,它可能会给我一个进一步的指示。
为此,我使用以下查询:
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
er.session_id,
er.blocking_session_id,
er.start_time,
er.status,
dbName = DB_NAME(er.database_id),
er.wait_type,
er.wait_time,
er.last_wait_type,
er.granted_query_memory,
er.reads,
er.logical_reads,
er.writes,
er.row_count,
er.total_elapsed_time,
er.cpu_time,
er.open_transaction_count,
er.open_transaction_count,
s.text,
qp.query_plan,
logDate = CONVERT(DATETIME,GETDATE()),
logTime = CONVERT(DATETIME,GETDATE())
FROM sys.dm_exec_requests er
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) s
CROSS APPLY sys.dm_exec_query_plan(er.plan_handle) qp
WHERE
CONVERT(VARCHAR(MAX), qp.query_plan) LIKE '%<missing%'
Run Code Online (Sandbox Code Playgroud)
它通常工作正常;但是,我最近遇到了整理和 XML 的问题:
错误信息说:
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
er.session_id,
er.blocking_session_id,
er.start_time,
er.status,
dbName = DB_NAME(er.database_id),
er.wait_type, …Run Code Online (Sandbox Code Playgroud) 这可能更像是一个 SO 问题,但是......
如果我正在为 OS X 编写一个将与在线 MySQL 数据库同步的客户端应用程序,那么我的 CD 是使用 SQLite 还是 XML 有什么区别?
我正在使用 Sql Server 2005 Express 版本在 xml 输出中显式地生成用户定义的节点。下面的代码工作正常,只是当用户表中不存在记录集时,我无法生成一个空节点。
代码:
select 1 as tag, null as parent,
FirstName as [User!1!FirstName!Element],
LastName as [User!1!LastName!Element]
FROM Users
FOR XML EXPLICIT
Run Code Online (Sandbox Code Playgroud)
输出:
<Users>
<FirstName>Ammy</FirstName>
<LastName>Dammy</LastName>
</Users>
<Users>
<FirstName>Lammy</FirstName>
<LastName>Lolly</LastName>
</Users>
Run Code Online (Sandbox Code Playgroud)
空表的预期输出:
<Users></Users>
Run Code Online (Sandbox Code Playgroud)
注意:我不喜欢这种xsnil方法,欢迎所有其他解决问题的方法
我的网络上运行着一组基于 XML 的服务。
这些服务中的数据需要镜像到 SQL Server 2008 实例上的表中。
将 XML 放入表中没有问题我已经可以做到了,但我现在要做的是将一大串 XML 传递给存储过程,然后使用 OPENXML 命令将其插入表中.
我想知道的是,不是使用 3rd 方程序从服务中获取这些数据,然后调用存储的过程并插入它,我是否有可能让 SQL Server 直接从中获取 XML服务 URL 并像这样处理它。
无论我尝试多少次,我似乎都能找到大量关于从服务器文件系统读取文件/从服务器文件系统写入文件的文章和帖子,以及实际插入 XML 数据的几百万条左右的文章,但我似乎无法找到查找有关让服务器直接从 URL 获取数据的任何内容。
干杯
-----====== 更新 25/8/2012 ======--
经过更多的研究,我找到了第三种方法来做到这一点:
declare @xmlObject as int
declare @responseText as varchar(max)
declare @url as varchar(2048)
select @url = 'http://server/feed/data'
exec sp_OACreate 'MSXML2.XMLHTTP', @xmlObject OUT;
exec sp_OAMethod @xmlObject, 'open', NULL, 'get', @url, 'false'
exec sp_OAMethod @xmlObject, 'send'
exec sp_OAMethod @xmlObject, 'responsetext', @responseText OUTPUT
exec sp_OADestroy @xmlObject
select @responseText
exec …Run Code Online (Sandbox Code Playgroud) 我有一个与此类似的 XML 文档:
<Root>
<Sub>
<Record>
<Guid>aslkjflaksjflkasjfkljsd</Guid>
</Record>
<Record>
<Guid>opqiwuerl;kasdlfkjawop</Guid>
</Record>
</Sub>
</Root>
Run Code Online (Sandbox Code Playgroud)
我正在<Record>根据某些标准替换整个节点。该<Record>节点包含一个<Guid>,我可以用它来识别它们(那些假装是有效的GUID请!)。
知道了 GUID,我将该节点的 XML 返回到一个变量中以供进一步处理。在下游,我需要能够删除该特定节点,以便我可以insert将节点的修改版本恢复到原始文档中。
有没有办法确定序数,或者使用delete/replace方法根据元素的值删除节点的另一种方法?
我创建了一个扩展事件来监视和调整 Selective Xml 索引
CREATE EVENT SESSION [SelectiveXmlIndexing] ON SERVER
ADD EVENT sqlserver.selective_xml_index_no_compatible_sql_type,
ADD EVENT sqlserver.selective_xml_index_no_compatible_xsd_types,
ADD EVENT sqlserver.selective_xml_index_path_not_indexed,
ADD EVENT sqlserver.selective_xml_index_path_not_supported
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
Run Code Online (Sandbox Code Playgroud)
在 SSMS 中,当我view live data然后执行xml查询和视图时,没有返回任何结果。
我所看到的是:

在看到结果之前,我还需要完成其他步骤吗?
我跟着:
http://www.mssqltips.com/sqlservertip/2731/managing-sql-server-extended-events-in-management-studio/
编辑,
添加请求的查询和索引
询问
WITH XMLNAMESPACES ( 'http://tempuri.org/tst.xsd' as tst )
SELECT
x.XmlId
,a.value('@id', 'int') As ColumnA
,b.value('.', 'NVARCHAR(25)') ColumnB
From
dbo.XmlTable As X
Cross Apply x.XmlContent.nodes('tst:Root/tst:Stuff') aa(a)
Cross Apply a.nodes('tst:Forms') bb(b)
Run Code Online (Sandbox Code Playgroud)
以及根元素和属性的索引
CREATE SELECTIVE XML INDEX [xsi_XmlTable] …Run Code Online (Sandbox Code Playgroud) <?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
</book>
</catalog>
Run Code Online (Sandbox Code Playgroud)
我有上面的xml文件。
在我的SQL Server 2008数据库有表Book__Master中的所有列都相同上述xml文件的元素,即有像列bookid,author,title等。
现在我想编写一个存储过程,它接受这个 xml 文件作为输入参数,并将元素的值按原样存储在它们各自的列中。
任何人都可以帮助我如何编写这种类型的存储过程?
当我们使用 for xml 子句从一行创建 xml 时,如下所示
select * from Menus where MenuID=100 for xml path('')
Run Code Online (Sandbox Code Playgroud)
xml 将错过具有 NULL 作为值的列。
我有一个像
select * from Menus where MenuID=100 for xml path('') , ELEMENTS XSINIL
Run Code Online (Sandbox Code Playgroud)
但是 xml 只会创建如下
<MenuID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">100</MenuID>
<MenuOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">1</MenuOrder>
Run Code Online (Sandbox Code Playgroud)
有没有办法用NULL列创建如下
<MenuID>100</MenuID>
<MenuOrder>1</MenuOrder>
Run Code Online (Sandbox Code Playgroud) 我有以下查询:
SELECT
[ID] AS [NewID]
, (
CASE WHEN LEN([MiddleName]) > 0 THEN
[LastName] + ', ' + [FirstName] + ' ' + LEFT([MiddleName],1) + '.'
ELSE
[LastName] + ', ' + [FirstName]
END
) AS [Name]
, [Title] AS [ProfTitle]
, CONVERT(CHAR(10),[DepartureDate],111) AS [BorDepart]
, [LocationOfficeNumber] AS [OfficePhone]
, [Location]
, [LocationSection] AS [Sec]
, [PracticeGroup] AS [PracticeTL]
, [Email]
FROM [dbo].[Borrowers]
Run Code Online (Sandbox Code Playgroud)
有了这个,我想知道如何编写一个转换为这个输出的 FOR XML 查询:
<sydney>
<import>
<template id="Borrower" name="Borrowers">
<record searchfield="NewID" searchvalue="NewID">
<field id="NewID">
<![CDATA[NEWID]]>
</field>
<field …Run Code Online (Sandbox Code Playgroud)