XML列中的某些节点值引用已知表的整数主键。是否可以让SQL Server检查这种外键关系?
答案 0 :(得分:4)
答案是否定的,你不能。
您无法在value()
关系中直接使用XML FOREIGN KEY
。为了好玩,我尝试创建一个计算列,其结果是在用户定义的函数中调用.value('<some xpath>', 'int')
。麻烦的是你也不能在FOREIGN KEY
关系中使用计算列。
在实际约束之外,您可以尝试在触发器中执行传入的INSERT
和UPDATE
语句的验证......但这已经成为一个解决方案的混乱。正如Damien所说 - 如果你想强制执行外键约束,那么它实际上不属于XML文档。
答案 1 :(得分:3)
答案是肯定的,你可以!
通过约束您的文档包含固定数量的此类引用,您可以为您的外键创建持久计算列。
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>');
答案 2 :(得分:0)
我会将其作为评论发布,但我没有足够的声誉:D。我认为你可以添加一个约束来返回一个函数的值,该函数可以在你的xml中有效。它不会是外键,但它至少会检查你的完整性。