2014-10-10 2 views
1

화폐 금액을 생성하는 XML이 있는데, 이는 종종 통화 변환의 결과이므로 정확한 정도 (이 경우 4dp)로 표시해야합니다. 목록에있는 번호로 XML을 생성 할 수 있지만 XML에 스키마를 적용하자마자 모든 "불필요한"0 자리가 제거된다는 것을 알게되었습니다. 컴퓨터의 관점에서 이것을 이해할 수는 있지만 각 번호의 가치에 관계없이 번호 정확도가 모든 숫자에 정확히 표시되어야합니다. 이해를 돕기 위해 우리는 항상 그러한 숫자에 정확하게 4 자리 소수점을 표시한다는 점에서 일관성이 있다면 훨씬 명확합니다.10 진수 소수점 자리 표시 자 10 진수 SimpleType으로 표현하십시오.

/* 
This script will create a schema collection, use it and drop it, so there is minimal chance of mess left behind 
*/ 
DECLARE @XSD XML 

SET @XSD = CONVERT(XML, 
'<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="xs3p.xsl"?> 
<xs:schema id="MyData" 
    targetNamespace="http://tempuri.org/MyData.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/MyData.xsd" 
    xmlns:mstns="http://tempuri.org/MyData.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:simpleType name="Money"> 
    <xs:restriction base="xs:decimal"> 
     <xs:totalDigits value="14" /> 
     <xs:fractionDigits value="4" /> 
    </xs:restriction> 
    </xs:simpleType> 
    <xs:element name="Root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Amount" type="Money" minOccurs="1" maxOccurs="unbounded"> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema>') 

-- Clean if there is owt to clean 
IF EXISTS (SELECT * FROM sys.xml_schema_collections WHERE name = 'TestMoney') 
    DROP XML SCHEMA COLLECTION TestMoney 

-- use our xml bit above to make a new schema collection 
CREATE XML SCHEMA COLLECTION TestMoney AS @XSD 
GO 

-- we'll create our xml untyped first, so we can check it before we change it 
DECLARE @Untyped_XML XML 
-- this is the real test, with the schema enforced 
DECLARE @XML XML(TestMoney) 

-- build some test data 
SET @Untyped_XML = 
'<?xml version ="1.0"?> 
<Root xmlns ="http://tempuri.org/MyData.xsd"> 
    <Amount>1.0000</Amount> 
    <Amount>0.1234</Amount> 
</Root>' 

-- try to apply the schema collection to our xml, and show something useful whatever happens. 
BEGIN TRY 
    SET @XML = @Untyped_XML 
    SELECT @Untyped_XML AS Before, @XML AS [After] 
END TRY 
BEGIN CATCH 
    SELECT 
     ERROR_MESSAGE() AS Problem 
     ,@Untyped_XML  AS FailedXML 
END CATCH 
GO 
-- We don't really want this schema; it was just a test 
DROP XML SCHEMA COLLECTION TestMoney 

전체 정확성에 표시되는 번호를 강제로 어떤 방법이 있나요 : 여기가 내 말은 (전 결과 후 비교) 무엇을보고 실행할 수있는 예는?

+0

필자는 잠시 동안 패턴 일치를 사용하여 결과가 패턴과 일치하는 방식으로 표시되도록하는 희망에서 소수점 네 자리를 요구한다고 생각했습니다. 슬프게도 정수의 정규형에는 소수점이 없으므로 단위 값 뒤에 '.0000'을 입력해도 패턴 일치에 실패합니다. 따라서''를 단순 유형에 추가하면 오류가 발생합니다. 이 [msdn 기사] (http://msdn.microsoft.com/en-us/library/bb510416.aspx)를 참조하십시오. 모든 정수를 문자열로 변환하고 싶지는 않습니다. ..! –

+0

아마도이 문제를 해결할 수있는 방법은 xml에 스타일 시트를 적용하여 실제로 값을 변경하지 않고보기 좋게 만드는 것이라고 생각하기 시작했습니다. 나는 이것을 생각하지만 최소한의 지식을 가지고있다. 그것은 SQL Server 내에서 xslt 변환을 적용하는 데 코딩을 사용해야하는 것 같습니다. 그것은 내 ken을 넘어서는 길입니다. XML 파일을 저장하기 위해 SSIS 패키지를 사용하고 있습니다. 아마도 변환을 적용 할 장소가 될까요? 이것이 올바른 접근법이라면 어떤 포인터라도 사용하면 좋습니다! [this?] (http://www.w3schools.com/xsl/el_decimal-format.asp) –

답변

0

좋아, 그렇게 쉬운 방법이없는 것 같습니다. 따라서 내 해결책은 xml의 유효성 검사를 시도하여 문제를 피하는 것입니다. 그런 다음 유효성 검사에서 오류가 발생하지 않으면 untyped_XML을 입력하여 올바르게 반환 할 수 있다고 추론합니다. 이것은 유형이없는 xml로 작업을 계속해야한다는 단점이 있지만 최소한 스키마의 척도로는 완벽 해 보입니다. 이를 위해, 나는이 가진 문제의 TRY/CATCH를 대체 :

-- try to apply the schema collection to our xml, and show something useful whatever happens. 
BEGIN TRY 
    SELECT @XML = @UNTYPED_XML 
END TRY 
BEGIN CATCH 
    SELECT @SchemaError = ERROR_MESSAGE() 
END CATCH 

-- If there was no error, then it is because the schema validated correctly, so show the original file. 
IF @SchemaError IS NULL 
    SELECT @Untyped_XML 
-- If there was an error, then display it, with the bad xml 
ELSE 
    SELECT @SchemaError AS 'ErrorEncountered', @Untyped_XML AS FailedXML 
GO 

이 만족스럽지이지만, 내가 생각 문제를 해결하고 난에 스타일 시트를 적용하지 않고 얻을거야 가장 좋은 것 같다 xml을 생성 한 후 (아마도 SSIS에서 XML 작업을 사용하여).