none
Gerar XML SCHEMA COLLECTION RRS feed

  • Pergunta

  • Boa tarte tarde a todos.

    Li pelas diferentes formas de se gerar um XML Schema a partir de uma tabela, entretanto da maneira que necessito de forma alguma encontrei.

    Quando realizo da seguinte maneira: 

    SELECT *
    FROM CH.Empresa
    FOR XML AUTO, XMLSCHEMA('Empresa')

    O resultado me retornado é este:

    <xsd:schema targetNamespace="Empresa" xmlns:schema="Empresa" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
      <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
      <xsd:element name="CH.Empresa">
        <xsd:complexType>
          <xsd:attribute name="iSistemaDestino" type="sqltypes:tinyint" use="required" />
          <xsd:attribute name="iSistemaOrigem" type="sqltypes:tinyint" use="required" />
          <xsd:attribute name="nCdEmpresaPRD">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:decimal">
                <xsd:totalDigits value="10" />
                <xsd:fractionDigits value="0" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="nCdEmpresaSistema" use="required">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:decimal">
                <xsd:totalDigits value="10" />
                <xsd:fractionDigits value="0" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cNmEmpresa" use="required">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="50" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cSgEmpresa">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="3" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cRazaoSocial" use="required">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="50" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cCNPJ" use="required">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="18" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cEndereco">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="50" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="iNumero" type="sqltypes:int" />
          <xsd:attribute name="cComplemento">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="20" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cBairro">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="50" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cCEP">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="15" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="nCdCidade">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:decimal">
                <xsd:totalDigits value="10" />
                <xsd:fractionDigits value="0" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cNmCidade">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="50" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="nCdUF">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:decimal">
                <xsd:totalDigits value="10" />
                <xsd:fractionDigits value="0" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cNmUF">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="20" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cSiglaUF">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="10" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="nCdTerceiroEquivalente">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:decimal">
                <xsd:totalDigits value="10" />
                <xsd:fractionDigits value="0" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="nCdEmpresaCorporate">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:decimal">
                <xsd:totalDigits value="10" />
                <xsd:fractionDigits value="0" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cAtivo" use="required">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:char" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="1" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="dInclusao" type="sqltypes:datetime" use="required" />
          <xsd:attribute name="dProcessamento" type="sqltypes:datetime" />
          <xsd:attribute name="cStatusIntegracao" use="required">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:char" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="1" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cMensagem">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="100" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="cAcao" use="required">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:char" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreNonSpace IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="1" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
          <xsd:attribute name="dUltimoPreFechamentoAtivo" type="sqltypes:datetime" />
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>

    Eu necessito da seguinte maneira:

    -- ------------------ --
    -- Valida XML empresa --
    -- ------------------ --
    
    /****** Object:  XmlSchemaCollection [SAF].[FBAL_IntegracaoPatrimonioEmpresa]    Script Date: 27/02/2013 16:38:51 ******/
    CREATE XML SCHEMA COLLECTION [CH].[SC_IntegracaoPatrimonioEmpresa] AS
    
    N'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    	<xsd:element name="Empresa">
    		<xsd:complexType>
    			<xsd:complexContent>
    				<xsd:restriction base="xsd:anyType">
    					<xsd:sequence>
    						<xsd:element name="CH.Empresa" maxOccurs="unbounded">
    							<xsd:complexType><xsd:complexContent>
    								<xsd:restriction base="xsd:anyType">
    									<xsd:sequence />
    										<xsd:attribute name="iSistemaDestino" type="xsd:positiveInteger" use="required" />
    										<xsd:attribute name="iSistemaOrigem" type="xsd:positiveInteger" use="required" />
    										<xsd:attribute name="nCdEmpresa" type="xsd:decimal" use="required" />
    										<xsd:attribute name="nCdEmpresaPRD" type="xsd:decimal" />
    										<xsd:attribute name="nCdEmpresaCorporate" type="xsd:decimal" />
    										<xsd:attribute name="cNmEmpresa" type="xsd:string" use="required" />
    										<xsd:attribute name="cSgEmpresa" type="xsd:string" />
    										<xsd:attribute name="cRazaoSocial" type="xsd:string" use="required" />
    										<xsd:attribute name="cCNPJ" type="xsd:string" use="required" />
    										<xsd:attribute name="cEndereco" type="xsd:string" />
    										<xsd:attribute name="iNumero" type="xsd:integer" />
    										<xsd:attribute name="cComplemento" type="xsd:string" />
    										<xsd:attribute name="cBairro" type="xsd:string" />
    										<xsd:attribute name="cCEP" type="xsd:string" />
    										<xsd:attribute name="nCdCidade" type="xsd:decimal" />
    										<xsd:attribute name="cNmCidade" type="xsd:string" />
    										<xsd:attribute name="nCdUF" type="xsd:decimal" />
    										<xsd:attribute name="cNmUF" type="xsd:string" />
    										<xsd:attribute name="cSiglaUF" type="xsd:string" />
    										<xsd:attribute name="nCdTerceiroEquivalente" type="xsd:decimal" />
    										<xsd:attribute name="dUltimoPreFechamentoAtivo" type="xsd:string" />
    										<xsd:attribute name="cAtivo" type="xsd:string" use="required" />
    										<xsd:attribute name="dInclusao" type="xsd:string" use="required" />
    										<xsd:attribute name="dProcessamento" type="xsd:string" use="required" />
    										<xsd:attribute name="cStatusIntegracao" type="xsd:string" use="required" />
    										<xsd:attribute name="cMensagem" type="xsd:string" />
    										<xsd:attribute name="cAcao" type="xsd:string" use="required" />
    									</xsd:restriction>
    								</xsd:complexContent>
    							</xsd:complexType>
    						</xsd:element>
    					</xsd:sequence>
    				</xsd:restriction>
    			</xsd:complexContent>
    		</xsd:complexType>
    	</xsd:element>
    </xsd:schema>'
    GO
    

    Se puderem me auxiliar serei grato, obrigado desde já.

    quinta-feira, 28 de fevereiro de 2013 13:28

Todas as Respostas

  • Estevaum,

    Veja se este exemplo não ajuda:

    USE AdventureWorks
    GO
    -- Criando schemas para validação de dados.
    -- Primeiramente vamos criar um schema para validar os dados que serão 
    -- inseridos na nossa tabela de produtos.
    IF EXISTS(SELECT * 
                FROM sys.xml_schema_collections
               WHERE name = 'xsdProds')
    BEGIN
      DROP XML SCHEMA COLLECTION xsdProds
    END
    GO
    
    CREATE XML SCHEMA COLLECTION xsdProds AS
    N'<?xml version="1.0"?>
     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
       <xs:element name="Raiz">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="Codigo" type="xs:integer" />
             <xs:element name="Nome" type="xs:string" />
           </xs:sequence>
         </xs:complexType>
       </xs:element>
     </xs:schema>'
    GO
    
    IF OBJECT_ID('Prods') IS NOT NULL
      DROP TABLE Prods
    GO
    
    -- Ao criar a tabela Prods desta vez inserimos uma referência ao schema criado.
    CREATE TABLE Prods (ID Int IDENTITY(1,1) PRIMARY KEY, ColunaXML XML(xsdProds))
    
    -- Ao utilizar um schema podemos dizer se no XML que será
    -- incluido iremos permitir fragmentos XML ou então apenas Documentos
    -- inteiros onde os níveis deverão ser sempre iguais, Utiliza-se CONTENT
    -- ou DOCUMENT, caso não seja especificado assim como no nosso exemplo
    -- o padrão é CONTENT
    
    -- Exemplo de um INSERT simples.
    INSERT INTO Prods(ColunaXML) VALUES('<Raiz>
                                           <Codigo>1</Codigo>
                                           <Nome>Nome de Algum Produto</Nome>
                                         </Raiz>')
    
    -- Exemplo de falha no INSERT, ao tentar inserir um valor string para o 
    -- elemento Código o SQL irá exibir uma mensagem de erro dizendo que o
    -- tipo de dados não está correto
    INSERT INTO Prods(ColunaXML) VALUES('<Raiz>
                                           <Codigo>STRING</Codigo>
                                           <Nome>Nome de Algum Produto</Nome>
                                         </Raiz>')
    
    -- Caso o XML esteja com alguma tag incorreta o SQL XSD não irá permitir
    -- que o INSERT seja efetuado com sucesso
    INSERT INTO Prods(ColunaXML) VALUES('<ROOT>
                                           <Codigo>2</Codigo>
                                           <Nome>Nome de Algum Produto</Nome>
                                         </ROOT>')
    
    -- Caso o XML não esteja exatamente no formato do schema que foi 
    -- criado então o INSERT não sera efetuado com sucesso
    INSERT INTO Prods(ColunaXML) VALUES('<Raiz>
                                           <Codigo>3</Codigo>
                                           <Nome>Nome de Algum Produto</Nome>
                                           <Marca>Marca de Algum Produto</Marca>
                                         </Raiz>')
    
    
    /*
      Existe alguma maneira facíl de gerar um schema para meu XML?
      Resposta: Sim várias.
      Por exemplo com o Visual Studio.
      Para fazer uma demo vamos gerar um arquivo XML com os dados da tabela Prods
    */
    
    SELECT * FROM Prods
    -- Salvar um arquivo com o resultado de um XML na pasta desktop\XML
    
    -- Abrir o arquivo no Visual Studio, Clicar em Create Schema e alterar 
    -- o type do elemento Codigo para Integer
    
    
    -- Gerando Schemas para validação de dados.
    
    -- Mais Sobre schemas
    
    -- XML Schema Definition Language (XSD) é o padrão recomendado pela W3C para validação de 
    -- arquivos XML, antes do XSD os schemas eram gerados no formato XML Data Reduced Schema(XDR)
    -- O SQLXML 4.0 possuir uma ferramenta para conversão de arquivos XDR para o novo formato
    -- XSD.
    -- Para gerar um schema no formato XDT devemos usar o comando XMLDATA, por exemplo.
    
    SELECT TOP 0 ProdCat.ProductCategoryID, ProdCat.Name Categoria, ProdSubCat.Name SubCategoria
      FROM Production.ProductCategory ProdCat
     INNER JOIN Production.ProductSubcategory ProdSubCat
        ON ProdCat.ProductCategoryID = ProdSubCat.ProductCategoryID
    FOR XML RAW, ELEMENTS, XMLDATA
    -- Salvar o resultado em um arquivo para analise.
    
    -- Para converter o arquivo podemos abrir o arquivo no Visual Studio e clicar 
    -- em Create Schema ou podemos usar o "cvtschema" que vem com o SQLXML 4.0
    -- Converter arquivo XDT para XSD a partir do Visual Studio.
    
    SELECT TOP 0 ProdCat.ProductCategoryID, ProdCat.Name Categoria, ProdSubCat.Name SubCategoria
      FROM Production.ProductCategory ProdCat
     INNER JOIN Production.ProductSubcategory ProdSubCat
        ON ProdCat.ProductCategoryID = ProdSubCat.ProductCategoryID
    FOR XML RAW, ELEMENTS, XMLSCHEMA
    -- Salvar o resultado em um arquivo para analise.
    
    -- Gerando schema a partir de um arquivo XML
    
    -- <XSD.exe> 
      -- Abrir o DOS e Mostrar exemplo de uso do XSD.exe
    --</XSD.exe>
    
    -- Criando um SCHEMA a partir de um arquivo XSD
    IF OBJECT_ID('ProdsIndex') IS NOT NULL
      DROP TABLE ProdsIndex
    GO
    
    IF EXISTS(SELECT * 
                FROM sys.xml_schema_collections
               WHERE name = 'XSDVar')
    BEGIN
      DROP XML SCHEMA COLLECTION XSDVar
    END
    GO
    
    DECLARE @x XML
    SET @X = (SELECT * 
                FROM OPENROWSET(BULK 'C:\Documents and Settings\fabiano\Desktop\xml\Produtos.xsd',
                                SINGLE_BLOB) AS A)
    -- Exibe o Schema
    SELECT @X
    
    -- Criar o schema a Partir da variavel
    CREATE XML SCHEMA COLLECTION XSDVar AS @x
    GO


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sábado, 2 de março de 2013 14:39