- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简而言之:我想对 SQL Server (2008) 数据库执行 XML 批量加载并为父项生成可在子项中使用的自动增量 ID。这似乎受到范围的限制:父节点尚未完成,因此尚未插入。有人知道解决这个问题的方法吗?
较长的描述(抱歉,真的很长,但我尽量完整):
我从一位客户那里得到了很多具有类似结构的 XML 文档,可以从中生成测试数据库。它们被导出供其他工具使用,我的客户没有权限或联系人来影响结构或内容。 (这些工具是由另一方为母公司编写的。)他也没有对 XML 或它们从中导出的数据库的正式描述。
事实证明,“顶级”XML 节点 <Registration>
确实有 ID,但这些在文档中不是唯一的。 (顶级节点是相对的,它们确实有一个根节点和一个列表节点,但在 XML 中它们是将进入数据库的最高元素。)ID 可以在其他 XML 文档中使用,因为它们引用到另一个对象<Case>
那不在导出中。所以我需要生成自动增量 ID 以保留所有 <Registration>
- 元素即使在文件中也是唯一的。
我的 <Registration>
-节点有很多女儿,例如<Activity>
-节点。这些节点需要引用它们的父节点,因此它们应该使用生成的自增 ID。然而,由于它们是未完成的父节点的一部分,父节点仍在范围内,并且尚未插入表中,如 msdn 上的“记录子集和键排序规则”中所述。和 technet .但是,这些站点上的示例具有明确的唯一性 CustomerId
,而不是自动生成的 ID。
尽管有关“键排序规则”的文档使它看起来无法完成,但我无法相信对于缺少(唯一)ID 的 XML 文件没有办法解决这个问题。更奇怪的是:它确实在 child 中插入了一个parent-id,但是数字低了一个。所以我假设这是来自先前范围的自动增量 ID(其中 0 是默认值,尚未插入任何内容,我确实期望为 NULL)。所以我确实看到了一种解决方法:之后在我的子表中增加父键( UPDATE Activity SET RegistrationId = RegistrationId + 1
)。但是,这确实需要保持限制 ( WHERE TimeStamp > ...
) 并且没有其他(手动或脚本)干预。
我已经尝试了很多不同的关系和 VB 脚本(例如,我更喜欢自动生成我的表),但我只会发布我最近的尝试。这也将用于说明从先前范围插入自动增量 ID。
我的主要问题是:
但其他提示也非常受欢迎,例如:
CREATE TABLE
的情况下使用什么设置来自动生成自动增量标识-SQL 语句?生成表格:
CREATE TABLE [dbo].[Registration](
[Id] INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_Registration PRIMARY KEY,
[XmlId] [nvarchar](40) NULL,
)
CREATE TABLE [dbo].[Activity](
[Id] INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_Activity PRIMARY KEY,
[RegistrationId] INT CONSTRAINT FK_Activity_Registration FOREIGN KEY (RegistrationId) REFERENCES Registration (Id),
[XmlId] [nvarchar](1000) NULL,
)
要导入的 XML 文件:
<Updates>
<Registrations>
<Registration ID="NonUniqCaseId-123">
<Activities>
<Activity ID="UniqActId-1234" />
<Activity ID="UniqActId-1235" />
</Activities>
</Registration>
<Registration ID="NonUniqCaseId-124">
<Activities>
<Activity ID="UniqActId-1241" />
<Activity ID="UniqActId-1242" />
</Activities>
</Registration>
</Registrations>
</Updates>
用于测试上传的 VB 脚本(我想稍后在程序中包含一个循环,以处理多个文件):
Dim objBL
Set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")
objBL.ConnectionString = "provider=SQLOLEDB;data source=localhost;database=Test;integrated security=SSPI"
objBL.ErrorLogFile = "error.log"
objBL.CheckConstraints = False
objBL.XMLFragment = False
objBL.SchemaGen = True
objBL.SGDropTables = False
objBL.KeepIdentity = False
objBL.Execute "BulkTestMapping.xsd", "BulkTestContents.xml"
Set objBL = Nothing
XSD:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
attributeFormDefault="qualified"
elementFormDefault="qualified"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xs:annotation>
<xs:appinfo>
<sql:relationship name="Registration_Activity"
parent="Registration"
parent-key="Id"
child="Activity"
child-key="RegistrationId"
inverse="true"
/>
</xs:appinfo>
</xs:annotation>
<xs:element name="Registration"
sql:relation="Registration"
sql:key-fields="Id"
>
<xs:complexType>
<xs:sequence>
<xs:element name="Activities" minOccurs="0" maxOccurs="unbounded" sql:is-constant="true">
<xs:complexType>
<xs:sequence>
<xs:element name="Activity" minOccurs="0" maxOccurs="unbounded"
sql:relation="Activity"
sql:key-fields="RegistrationId"
sql:relationship="Registration_Activity"
>
<xs:complexType>
<xs:attribute name="ID" sql:field="XmlId" form="unqualified" type="xs:string" />
<xs:attribute name="DbId" sql:identity="ignore" sql:field="Id" msdata:AutoIncrement="true" msdata:ReadOnly="true" type="xs:int" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="ID" form="unqualified" sql:field="XmlId" />
<xs:attribute name="DbId" sql:identity="ignore" sql:field="Id" msdata:AutoIncrement="true" type="xs:int" />
</xs:complexType>
</xs:element>
</xs:schema>
生成的表格(注意 RegistrationId
相差一个):
[Registration]
Id XmlId
1 NonUniqCaseId-123
2 NonUniqCaseId-124
[Activity]
Id RegistrationId XmlId
1 0 UniqActId-1234
2 0 UniqActId-1235
3 1 UniqActId-1241
4 1 UniqActId-1242
编辑:比我想象的还要糟糕。如果我再次添加记录,外键(子键)又从0开始!因此,很难甚至不可能确定(每个表)的更正应该是什么:
[Registration]
Id XmlId
1 NonUniqCaseId-123
2 NonUniqCaseId-124
3 NonUniqCaseId-123
4 NonUniqCaseId-124
[Activity]
Id RegistrationId XmlId
1 0 UniqActId-1234
2 0 UniqActId-1235
3 1 UniqActId-1241
4 1 UniqActId-1242
5 0 UniqActId-1234
6 0 UniqActId-1235
7 1 UniqActId-1241
8 1 UniqActId-1242
最佳答案
我不知道使用 XML 进行批量加载,所以这里是使用 TSQL 执行此操作的答案。
在 SQL Server 2008 中,您可以结合使用合并和输出来创建源数据和目标自动生成的 ID 之间的映射。
Using merge..output to get mapping between source.id and target.id
Dr. OUTPUT or: How I Learned to Stop Worrying and Love the MERGE
在这种情况下,您可以合并到 Registration
并将具有生成的 id 的子 XML 节点输出到临时表或表变量,然后使用该表插入到 Activity
.
MS SQL Server 2008 架构设置:
CREATE TABLE [dbo].[Registration](
[Id] INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_Registration PRIMARY KEY,
[XmlId] [nvarchar](40) NULL,
);
CREATE TABLE [dbo].[Activity](
[Id] INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_Activity PRIMARY KEY,
[RegistrationId] INT CONSTRAINT FK_Activity_Registration FOREIGN KEY (RegistrationId) REFERENCES Registration (Id),
[XmlId] [nvarchar](1000) NULL,
);
查询 1:
declare @XML xml = '
<Updates>
<Registrations>
<Registration ID="NonUniqCaseId-123">
<Activities>
<Activity ID="UniqActId-1234" />
<Activity ID="UniqActId-1235" />
</Activities>
</Registration>
<Registration ID="NonUniqCaseId-124">
<Activities>
<Activity ID="UniqActId-1241" />
<Activity ID="UniqActId-1242" />
</Activities>
</Registration>
</Registrations>
</Updates>';
declare @T table
(
RegistrationId nvarchar(40),
Activities xml
);
merge Registration as T
using
(
select R.N.value('@ID', 'nvarchar(40)') as XmlId,
R.N.query('Activities') as Activities
from @XML.nodes('/Updates/Registrations/Registration') as R(N)
) as S
on 0 = 1
when not matched then
insert(XmlId) values (S.XmlId)
output inserted.Id, S.Activities into @T(RegistrationId, Activities);
insert into Activity(RegistrationId, XmlId)
select T.RegistrationId,
A.N.value('@ID', 'nvarchar(1000)')
from @T as T
cross apply T.Activities.nodes('Activities/Activity') as A(N);
查询 2:
select *
from Registration;
Results :
| ID | XMLID |
--------------------------
| 1 | NonUniqCaseId-123 |
| 2 | NonUniqCaseId-124 |
查询 3:
select *
from Activity;
Results :
| ID | REGISTRATIONID | XMLID |
----------------------------------------
| 5 | 1 | UniqActId-1234 |
| 6 | 1 | UniqActId-1235 |
| 7 | 2 | UniqActId-1241 |
| 8 | 2 | UniqActId-1242 |
关于sql-server - 批量加载 XML 引用自动递增的 parent-id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13397885/
出现在 python 2.7.8 中。 3.4.1 不会发生这种情况。 示例: >>> id(id) 140117478913736 >>> id(id) 140117478913736 >>> id
好吧,我对动态创建的控件的 ID 很困惑。 Public Class TestClass Inherits Panel Implements INamingContainer
我收到下面的错误,说有堆栈溢出。发生这种情况是因为带有 IN (id, id, id...id) 的 SQL 语句有大量参数。有没有什么办法解决这一问题?这是在我使用 Eclipse 的本地环境中发生
为什么 CPython(不知道其他 Python 实现)有以下行为? tuple1 = () tuple2 = ()
为什么 CPython(对其他 Python 实现一无所知)有以下行为? tuple1 = () tuple2 = ()
非常简单的问题:当我有一个持久对象时,它通常有一个名为 ID 的属性(对于抽象类)。 那么..命名约定是ID还是Id? 例如。 public int ID { get; set; } 或 public
知道为什么我会收到此错误,我已经尝试了所有命名约定(小写/大写) 我正在使用 Vaadin,这是我的代码片段: public class Usercontainer extends BeanI
为什么 CPython(不知道其他 Python 实现)有以下行为? tuple1 = () tuple2 = ()
我需要改变表的所有主键 UPDATE TODO SET id = id + 1 但我做不到(Demo 来自 Ahmad Al-Mutawa 的回答)描述了原因。主键不能这样改。 我也不能根据这是 sq
我正在尝试列出与用户相关的讨论列表。 想象一下,如果你愿意的话: posts -------------------------------------------------------------
我有一个表,其中包含一些具有自己的 ID 和共享 SKU key 的文章。我尝试使用左连接进行查询,并使用组结果获取从查询返回的所有 id。 我的数据结构是这样的: id - name -
在下表People中: id name 1 James 2 Yun 3 Ethan 如果我想找到最大 ID,我可以运行此查询 select max(id) id from People; 结果是
我正在产品页面上创建评论模块,其中显示垃圾评论选项,并显示 onclick 显示和隐藏弹出窗口。现在它在单个评论中工作正常但是当评论是两个时它同时打开两个因为类是相同的。现在这就是为什么我想要获取父
根据 REST 哲学,PUT操作应该(取自维基百科): PUT http://example.com/resources/142 Update the address member of the co
我想知道如何在使用 PHP 或 JavaScript 进行身份验证后从 Google Analytics 获取 Property Id、View Id 和 Account Id?因为我希望能够将它们存
我想使用所选按钮的 ID 进行删除。但我不知道如何从中获取/获取 id。我尝试了 this.id 但不起作用。 这是我创建按钮的地方: var deleteEmployer= document.cre
我有一个具有以下结构的表“表” ID LinkedWith 12 13 13 12 14 13 15 14 16
请不要在未阅读问题的情况下将问题标记为重复。我确实发布了一个类似的问题,但 STACKOVERFLOW 社区成员要求我单独重新发布修改后的问题,因为考虑到一个小而微妙的修改,解决方案要复杂得多。 假设
在 Android Studio 中,我创建了一个 Person.java 类。我使用Generate 创建了getter 和setter 以及构造函数。 这是我的 Person.java 类: pu
如何在 jQuery 中制作这样的东西: //这是显示的主体 ID //当我悬停 #hover-id 时,我希望 #principal-id 消失并更改 。但是当我将光标放在 #this-id 上时
我是一名优秀的程序员,十分优秀!