2012-05-21 41 views
3

的SQL Server 2008允許我們定義一個類型化的XML列/變量來驗證對現有的XML架構集合XML:DECLARE @TypedXml XML(MyXmlSchemaCollection)在SQL Server 2008中使用在運行時指定的XSD驗證XML?

然而,據我所看到的,XML架構集合了當時被稱爲我們定義列/變量。

有沒有辦法使用在運行時指定的XML模式驗證XML?

例如:

DECLARE @Xml XML 
SET @Xml = 
N'<person> 
    <firstname>Ming</firstname> 
    <lastname>The Merciless</lastname> 
</person>' 

DECLARE @Xsd XML 
SET @Xsd = 
N'<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="person"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="firstname" type="xs:string"/> 
     <xs:element name="lastname" type="xs:string"/> 
     <xs:element name="dateofbirth" type="xs:date"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema>' 

DECLARE @Valid BIT 
SET @Valid = (SELECT dbo.f_ValidateXmlAgainstXsd(@Xml, @Xsd)) -- With a user-defined function? 
EXEC @Valid = s_ValidateXmlAgainstXsd @Xml, @Xsd -- With a stored procedure? 

回答

1

對於你這樣的要求,我可能會探索CLR集成:利用stored proceduresuser defined functions;你應該首先檢查你的環境是否允許CLR集成。

在這裏發帖太多了;但是,使用.NET驗證XML文檔的代碼很常見,並且我已經添加到SQL Server在線書籍的鏈接將會在那裏,只要SQL 2008將在...

一般來說,我相信要實現驗證,不受支持XSD的限制在SQL Server上,應該依賴於CLR集成。無論如何,here所描述的SQL服務器上的XSD集合中的限制可能會讓很多人在這個方向上搖擺不定。在高容量環境中需要弄清楚一些問題,編譯的XSD緩存是我心目中最重要的問題。另一個是XSD的複雜性,以及XSD如何被採集和引用(包括/導入/重新定義支持)。試圖實現自己這些方面將讓你肯定讚賞爲什麼xsd:include不被SQL Server支持...

+0

感謝Petru的全面解答。我懷疑CLR是要走的路,但只是想檢查我沒有忽略在本機SQL Server代碼中執行它的方式。 –

0

如果您使用存儲在數據庫中的預定義XSD進行驗證,可以在存儲過程中使用動態SQL來進行驗證。

如果你想對任何XSD進行驗證,最好使用CLR,就像在Petru的回答中一樣。

以下腳本可以使用。如果輸入XML無效,它將引發異常。如果您希望驗證僅僅返回一個結果,而不是引發異常,則可以使用try/catch子句。

編輯: 您不能在函數中使用動態SQL,但可以將此腳本包裝在存儲過程中。

DECLARE @result int 

    DECLARE @XsdValidationSQL nvarchar(max) = 
     'DECLARE @xml xml(' + @xsdSchema + '.' + @xsdName + ') = ''' + CONVERT(nvarchar(max), @xml) + '''' 

    EXEC @result = sp_executesql @XsdValidationSQL 

    RETURN @result 
+0

你能詳細解釋一下你是怎麼做的,因爲結果是:'消息557,級別16,狀態2,行6 只有函數和一些擴展存儲過程可以在一個函數中執行。' – new2ios

+0

@ new2ios你'對了,我測試了代碼,但沒有在將函數包裝進去之後進行實際測試。我不知道你不允許從函數內部執行動態SQL。抱歉。 – kappamaki