Criar variáveis e colunas de tipo de dados XML

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

O tipo de dados xml é um tipo de dados interno no SQL Server e é semelhante a outros tipos internos, como int e varchar. Assim como ocorre com outros tipos internos, é possível usar o tipo de dados xml como um tipo de coluna quando você cria uma tabela como um tipo variável, um tipo de parâmetro, um tipo de retorno de função, ou em CAST e CONVERT.

Criar colunas e variáveis

Para criar uma coluna de tipo xml como parte de uma tabela, use uma instrução CREATE TABLE , conforme mostrado no exemplo a seguir:

CREATE TABLE T1(Col1 int primary key, Col2 xml);

É possível usar uma DECLARE statement para criar uma variável de tipo xml , conforme mostrado no exemplo a seguir.

DECLARE @x xml;

Crie uma variável xml com tipo especificando uma coleção de esquema XML, conforme mostrado no exemplo a seguir.

DECLARE @x xml (Sales.StoreSurveySchemaCollection)

Para passar um parâmetro de tipo xml para um procedimento armazenado, use uma instrução CREATE PROCEDURE , conforme mostrado no exemplo a seguir:

CREATE PROCEDURE SampleProc(@XmlDoc xml) AS ...

É possível usar XQuery para consultar instâncias XML armazenadas em colunas, parâmetros ou variáveis. Também é possível usar o XML DML (linguagem de manipulação de dados) para aplicar alterações nas instâncias XML. Como o padrão XQuery não definiu a DML XQuery no momento do desenvolvimento, o SQL Server apresenta extensões da Linguagem de modificação de dados XML para o XQuery. Essas extensões permitem executar operações de inserção, atualização e exclusão.

Atribuindo padrões

Em uma tabela, é possível atribuir uma instância XML padrão a uma coluna de tipo xml . É possível fornecer o XML padrão de uma de duas maneiras: usando uma constante XML ou usando uma conversão explícita para o tipo xml .

Para fornecer o XML padrão como uma constante XML, use sintaxe conforme mostrado no exemplo a seguir. A cadeia de caracteres é implicitamente transformada com CAST no tipo xml.

CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')

Para fornecer o XML padrão como um CAST explícito para xml, use a sintaxe mostrada no exemplo a seguir.

CREATE TABLE T (XmlColumn xml
                  default CAST(N'<element1/><element2/>' AS xml))

O SQL Server também oferece suporte a restrições NULL e NOT NULL em colunas do tipo xml. Por exemplo:

CREATE TABLE T (XmlColumn xml NOT NULL)

Especificar restrições

Ao criar colunas de tipo xml , é possível definir restrições em nível de coluna ou de tabela. Use restrições nas situações seguintes:

  • Suas regras de negócios não podem ser expressas em esquemas XML. Por exemplo, o endereço de entrega de uma floricultura deve estar dentro de 50 milhas do local da empresa. Isto pode ser escrito como uma restrição na coluna XML. A restrição pode envolver métodos de tipo de dados xml .

  • A restrição envolve outras colunas XML ou não XML na tabela. Um exemplo é a imposição da ID de um cliente (/Customer/@CustId) localizado em uma instância XML para que corresponda ao valor em uma coluna CustomerID relacional.

Você pode especificar restrições para colunas de tipo de dados xml com tipo ou sem-tipo. No entanto, não pode usar os métodos do tipo de dados XML ao especificar restrições.

O tipo de dados xml não é compatível com as seguintes restrições de coluna e tabela:

  • PRIMARY KEY/ FOREIGN KEY

  • UNIQUE

  • COLLATE

    O XML fornece sua própria codificação. Ordenações são aplicadas apenas a tipos de cadeia de caracteres. O tipo de dados xml não é um tipo de cadeia de caracteres. No entanto ele tem representação de cadeia de caracteres e permite conversão em tipos de cadeia de caracteres e vice-versa.

  • RULE

Uma alternativa ao uso de restrições é criar um wrapper, uma função definida pelo usuário para encapsular o método de tipo de dados xml e especificar uma função definida pelo usuário na restrição de verificação, como mostrado no exemplo a seguir.

No exemplo a seguir, a restrição na Col2 especifica que cada instância XML armazenada nessa coluna deve ter um elemento <ProductDescription> que contém um atributo ProductID . Essa restrição é imposta pela função definida pelo usuário:

CREATE FUNCTION my_udf(@var xml) returns bit
AS BEGIN
RETURN @var.exist('/ProductDescription/@ProductID')
END;
GO

O método exist() do tipo de dados xml retorna 1 quando o elemento <ProductDescription> na instância contém o atributo ProductID. Caso contrário, ele retornará 0.

Agora, você pode criar uma tabela com uma restrição em nível de coluna da seguinte maneira:

CREATE TABLE T (
    Col1 int primary key,
    Col2 xml check(dbo.my_udf(Col2) = 1));
GO

A seguinte inserção é feita com êxito:

INSERT INTO T values(1,'<ProductDescription ProductID="1" />');

Por causa da restrição, a seguinte inserção não tem êxito:

INSERT INTO T values(1,'<Product />');

Mesma tabela ou tabela diferente

Uma coluna de tipo de dados xml pode ser criada em uma tabela que contém outras colunas relacionais ou em uma tabela separada com uma relação de chave estrangeira com uma tabela principal.

Crie uma coluna de tipo de dados xml na mesma tabela quando um das seguintes condições for verdadeira:

  • Seu aplicativo executa a recuperação de dados na coluna XML e não requer um índice XML na coluna XML.

  • Você deseja criar um índice XML na coluna de tipo de dados xml e a chave primária da tabela principal é a mesma que sua chave de clustering. Para obter mais informações, confira Índices XML (SQL Server).

Crie uma coluna de tipo de dados xml na mesma tabela quando um das seguintes condições for verdadeira:

  • Você deseja criar um índice XML na coluna de tipo de dados xml , mas a chave primária da tabela principal é diferente de sua chave de clustering, a tabela principal não tem uma chave primária ou a tabela principal é um heap (sem chave de clustering). Isto poderá ser verdade se a tabela principal já existir.

  • Você não quer que as varreduras de tabela fiquem mais lentas devido à presença da coluna XML na tabela. Isso usará espaço se for armazenado dentro da linha ou fora da linha.