Sql server 是否可以为XML中的数据安排外键约束?

Sql server 是否可以为XML中的数据安排外键约束?,sql-server,xml,sql-server-2008,tsql,foreign-key-relationship,Sql Server,Xml,Sql Server 2008,Tsql,Foreign Key Relationship,XML列中的某些节点值引用已知表的整数主键。可以让SQL Server检查这种外键关系吗?答案是不可以,您不能 不能在外键关系中直接使用XMLvalue()。为了好玩,我尝试创建了一个计算列,其结果是调用.value(''int')封装在用户定义的函数中。问题是,您也不能在外键关系中使用计算列 在实际约束之外,您可以尝试在触发器中对传入的INSERT和UPDATE语句执行验证…但这已经成为一个混乱的解决方案。正如Damien所说,如果您想强制执行外键约束,这实际上不属于XML文档。我会将其作为注

XML列中的某些节点值引用已知表的整数主键。可以让SQL Server检查这种外键关系吗?

答案是不可以,您不能

不能在
外键
关系中直接使用XML
value()
。为了好玩,我尝试创建了一个计算列,其结果是调用
.value(''int')
封装在用户定义的函数中。问题是,您也不能在
外键
关系中使用计算列


在实际约束之外,您可以尝试在触发器中对传入的
INSERT
UPDATE
语句执行验证…但这已经成为一个混乱的解决方案。正如Damien所说,如果您想强制执行外键约束,这实际上不属于XML文档。

我会将其作为注释发布,但我没有足够的声誉:D.我认为您可以添加一个约束,返回在XML中有效的函数值。它不会是外键,但至少会检查您的完整性。

答案是肯定的,您可以

由于文档包含固定数量的此类引用,因此可以为外键创建持久化计算列

CREATE FUNCTION dbo.GetFooRef(@doc XML)
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN
    RETURN @doc.value(N'(/doc/foo/@id)[1]','int');
END;

CREATE TABLE Foo(id INT PRIMARY KEY);

CREATE TABLE Bar(
    doc XML,
    ref AS (dbo.GetFooRef(doc)) PERSISTED FOREIGN KEY REFERENCES dbo.Foo(id)
);

INSERT INTO dbo.Bar(doc) VALUES ('<doc><foo id="1"/></doc>');
--The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Bar__ref__ ..."
INSERT INTO dbo.Foo(id) VALUES (1);
INSERT INTO dbo.Bar(doc) VALUES ('<doc><foo id="1"/></doc>');
创建函数dbo.GetFooRef(@docxml)
返回整数
诡计多端
作为
开始
返回@doc.value(N'(/doc/foo/@id)[1],'int');
结束;
创建表Foo(id INT主键);
创建表格栏(
docxml,
refas(dbo.GetFooRef(doc))持久化外键引用dbo.Foo(id)
);
插入dbo.Bar(doc)值(“”);
--INSERT语句与外键约束“FK\uuuuu Bar\uuuuuu ref\uuuuu…”冲突
插入dbo.Foo(id)值(1);
插入dbo.Bar(doc)值(“”);

如果您想强制执行这种关系,那么它不属于XML文档。我不理解您的评论。我只需要启用SQL Server的某些机制,根据表键检查文档。它是如何改变XML文档的概念的?如果您想要强制执行键关系,那么您需要将XML分解到表中。是的,使用触发器的解决方案将起作用,这是一个困难的解决方案。我需要的是存储半结构化数据,而我不能像使用常规外键的引用表那样使用查询来构建XML。有许多被引用的表,结构相当随意。也许我必须寻找另一种表示半结构化数据的方法。酷!什么最低版本的SQL Server支持这一点?我在2014年对此进行了测试,所以说不上来。但是,所需的功能似乎在2005年就可以使用了。我应该补充一点,如果您的xml实际上有固定数量的此类引用,那么您可能希望查看稀疏列和列集作为一个选项