如何读取 XML 文件并将 XML 中的数据存储到 SQL Server 2008 中的表中?
设置:
create table dbo.T
(
ID int identity primary key,
XMLDoc xml not null
);
insert into dbo.T(XMLDoc)
select (
select N.Number
for xml path(''), type
)
from (
select top(10000) row_number() over(order by (select null)) as Number
from sys.columns as c1, sys.columns as c2
) as N;
Run Code Online (Sandbox Code Playgroud)
每行的示例 XML:
<Number>314</Number>
Run Code Online (Sandbox Code Playgroud)
查询的任务是计算T指定值为 的行数<Number>。
有两种明显的方法可以做到这一点:
select count(*)
from dbo.T as T
where T.XMLDoc.value('/Number[1]', 'int') = 314;
select count(*)
from dbo.T as T
where T.XMLDoc.exist('/Number[. eq 314]') = …Run Code Online (Sandbox Code Playgroud) performance xml sql-server execution-plan sql-server-2012 query-performance
我负责在一个项目上创建一个数据库。我们有很少有值的字段(每 10,000 条记录中有 1 个),我正在尝试找出将其存储在数据库中的最佳方法。
据我所知,我有 3 个选择:
还有其他我没有考虑过的选择吗?
我正在尝试找出每种方法的优缺点。据我所知,1 将是最简单的,而 2 将占用最少的空间,但我正在努力为 3 找到许多资源。
如何编写 SQL 将 XML 文件读入 PostgreSQLXML值?
PostgreSQL 有一个原生XML 数据类型,具有将XMLPARSE文本字符串解析为该类型的函数。它还具有从文件系统读取数据的方法;在COPY声明中,等等。
但我没有看到编写原生 PostgreSQL SQL 语句来读取文件系统条目中的内容并使用它来填充XML值的方法。我怎样才能做到这一点?
我在学校学到的只是将数据保存到表中的 SQL。现在我正在研究一个数据存储在 XML 文件中的项目。此外,每个 XML 都包含对可视文件 (JPEG) 的引用。
XML 本身包含一千多个坐标点,以及有关数据的附加信息。
在我看来,将这些信息存储在表格中是没有意义的。此外,我也无法使用 SQL 存储 JPEG 文件。
什么是合适的解决方案,或者我这边的推理是否有错误?
如您所见,我对数据库很陌生。因此,欢迎任何建设性的建议、链接和建议。
我正在尝试使用一组值更新表。数组中的每一项都包含与 SQL Server 数据库表中的行匹配的信息。如果该行已存在于表中,我们将使用给定数组中的信息更新该行。否则,我们在表中插入一个新行。我已经基本上描述了 upsert。
现在,我试图在采用 XML 参数的存储过程中实现这一点。我使用 XML 而不是表值参数的原因是,执行后者时,我必须在 SQL 中创建自定义类型并将此类型与存储过程相关联。如果我以后更改了存储过程或数据库架构中的某些内容,则必须重做存储过程和自定义类型。我想避免这种情况。此外,TVP 相对于 XML 的优势对我的情况没有用,因为我的数据数组大小永远不会超过 1000。这意味着我不能使用这里提出的解决方案:How to insert multiple records using XML in SQL server 2008
此外,这里的类似讨论(UPSERT - 是否有更好的替代 MERGE 或 @@rowcount?)与我所问的不同,因为我试图将多行插入到表中。
我希望我可以简单地使用以下一组查询来更新 xml 中的值。但这行不通。当输入是单行时,这种方法应该有效。
begin tran
update table with (serializable) set select * from xml_param
where key = @key
if @@rowcount = 0
begin
insert table (key, ...) values (@key,..)
end
commit tran
Run Code Online (Sandbox Code Playgroud)
下一个替代方法是使用详尽的 IF EXISTS 或其以下形式的变体之一。但是,我以次优效率为由拒绝了这一点:
IF (SELECT COUNT ... ) > 0 …Run Code Online (Sandbox Code Playgroud) 给定一个在 XML 模式集合中定义的元素,如下所示:
<xsd:element name="xid">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="32" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)
您将如何使用 XQuery 更新元素?
该元素位于架构集合的ns命名空间中。我一直在尝试更新以下查询的元素:
update cm.item
set data.modify(
'declare namespace ns="http://www.anon.com";
replace value of (/ns:*/ns:xid)[1] with "X00011793" cast as element(ns{http://www.anon.com}:xid,#anonymous) ?')
where id = 11793
Run Code Online (Sandbox Code Playgroud)
但这会产生以下错误:
消息 9301,级别 16,状态 1,第 2 行 XQuery [cm.item.data.modify()]:在此版本的服务器中,“cast as”不可用。请使用“演员为?” 句法。
如果我完全删除演员表并使用此查询:
update cm.item
set data.modify(
'declare namespace ns="http://www.anon.com";
replace value of (/ns:*/ns:xid)[1] with "X00011793"')
where id = 11793
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
消息 2247,级别 16,状态 1,第 2 行 XQuery [cm.item.data.modify()]:该值的类型为“xs:string”,它不是预期类型“<anonymous>”的子类型。
如果我发出这个查询: …
我有一XML列包含具有类似结构的数据:
<Root>
<Elements>
<Element Code="1" Value="aaa"></Element>
<Element Code="2" Value="bbb"></Element>
<Element Code="3" Value="ccc"></Element>
</Elements>
</Root>
Run Code Online (Sandbox Code Playgroud)
如何使用 SQL Server 修改数据以将每个Value属性更改为元素?
<Root>
<Elements>
<Element Code="1">
<Value>aaa</Value>
</Element>
<Element Code="2">
<Value>bbb</Value>
</Element>
<Element Code="3">
<Value>ccc</Value>
</Element>
</Elements>
</Root>
Run Code Online (Sandbox Code Playgroud)
更新:
我的 XML 看起来更像这样:
<Root attr1="val1" attr2="val2">
<Elements>
<Element Code="1" Value="aaa" ExtraData="extra" />
<Element Code="2" Value="bbb" ExtraData="extra" />
<Element Code="3" Value="ccc" ExtraData="extra" />
<Element Code="4" Value="" ExtraData="extra" />
<Element Code="5" ExtraData="extra" />
</Elements>
<ExtraData>
<!-- Some XML is here -->
</ExtraData>
</Root> …Run Code Online (Sandbox Code Playgroud) 我正在使用Bluefeet 的这个很好的例子https://dba.stackexchange.com/a/25818/113298,来创建一个数据透视表并将其转换为 xml 数据。
声明参数
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
Run Code Online (Sandbox Code Playgroud)
接下来有一个代码很多的CTE,CTE的最终结果放在一个临时数据库中(与示例中相同)
SELECT
B.[StayDate] -- this is a date dd-mm-yyyy
, B.[Guid]
INTO #tempDates
FROM BaseSelection B
Run Code Online (Sandbox Code Playgroud)
生成 cols(与示例相同)
SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120))
FROM #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
Run Code Online (Sandbox Code Playgroud)
结果集是我应该期望的
set @query =
'SELECT [Guid],' + @cols +'
FROM
(
SELECT
[StayDate]
,[Guid]
FROM #tempDates
) A
pivot
(
count([StayDate])
for [StayDate] in (' + @cols +')
) …Run Code Online (Sandbox Code Playgroud) 我在数据库中存储了 HTML 代码,我想将其作为 XML 读取。
我的代码:
http://rextester.com/RMEHO89992
这是我拥有的 HTML 代码示例:
<div>
<section>
<h4>
<span> A </span>
</h4>
<ul>
<li>
<span> Ab</span>
AD
<span> AC </span>
</li>
<li>
<span> Ag</span>
<span> AL </span>
</li>
</ul>
<h4>
<span> B </span>
</h4>
<ul>
<li>
<span> Bb</span>
BD
<span> BC </span>
</li>
<li>
<span> Bg</span>
<span> BL </span>
</li>
</ul>
</section>
</div>
Run Code Online (Sandbox Code Playgroud)
这是我需要的输出示例:
Category Selection Value
--------- --------- ------------
A Ab AD
A Ag AL
B Bb BD
B Bg BL
Run Code Online (Sandbox Code Playgroud)
我需要将<h4>标签内的值作为 …