Crear variables y columnas del tipo de datos XMLCreate XML Data Type Variables and Columns

El tipo de datos xml es un tipo de datos integrado en SQL ServerSQL Server y es de algún modo similar a otros tipos integrados, como int y varchar.The xml data type is a built-in data type in SQL ServerSQL Server and is somewhat similar to other built-in types such as int and varchar. Al igual que ocurre con otros tipos integrados, se puede usar el tipo de datos xml como un tipo de columna al crear una tabla como un tipo de variable, un tipo de parámetro, un tipo de valor devuelto por una función o en CAST y CONVERT.As with other built-in types, you can use the xml data type as a column type when you create a table as a variable type, a parameter type, a function-return type, or in CAST and CONVERT.

Crear columnas y variablesCreating Columns and Variables

Para crear una columna de tipo xml como parte de una tabla, utilice una instrucción CREATE TABLE , como se muestra en el ejemplo siguiente:To create an xml type column as part of a table, use a CREATE TABLE statement, as shown in the following example:

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

Puede utilizar una instrucción DECLARE statement para crear una variable de tipo xml , como se muestra en el ejemplo siguiente.You can use a DECLARE statement to create a variable of xml type, as the following example shows.

DECLARE @x xml   

Para crear una variable de tipo xml , especifique una colección de esquemas XML, como se muestra en el ejemplo siguiente.Create a typed xml variable by specifying an XML schema collection, as shown in the following example.

DECLARE @x xml (Sales.StoreSurveySchemaCollection)  

Para pasar un parámetro de tipo xml a un procedimiento almacenado, utilice una instrucción CREATE PROCEDURE , como se muestra en el ejemplo siguiente.To pass an xml type parameter to a stored procedure, use a CREATE PROCEDURE statement, as shown in the following example.

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

Puede utilizar XQuery para consultar instancias XML almacenadas en columnas, parámetros o variables.You can use XQuery to query XML instances stored in columns, parameters, or variables. También puede utilizar el Lenguaje de manipulación de datos XML (XML DML) para aplicar actualizaciones a las instancias XML.You can also use the XML Data Manipulation Language (XML DML) to apply updates to the XML instances. Puesto que el estándar XQuery no definió el DML de XQuery cuando se desarrolló, SQL ServerSQL Server incluye las extensiones del Lenguaje de manipulación de datos XML (XML DML) en XQuery.Because the XQuery standard did not define XQuery DML at the time of development, SQL ServerSQL Server introduces XML Data Modification Language extensions to XQuery. Estas extensiones permiten realizar operaciones de inserción, actualización y eliminación.These extensions allow you to perform insert, update, and delete operations.

Asignar valores predeterminadosAssigning Defaults

En una tabla, puede asignar una instancia XML predeterminada a una columna de tipo xml .In a table, you can assign a default XML instance to a column of xml type. Puede proporcionar el XML predeterminado de una de estas dos maneras: con una constante XML o con una conversión explícita al tipo xml .You can provide the default XML in one of two ways: by using an XML constant, or by using an explicit cast to the xml type.

Para proporcionar el XML predeterminado como una constante XML, utilice la sintaxis como se muestra en el ejemplo siguiente.To provide the default XML as an XML constant, use syntax as shown in the following example. Observe que la cadena se convierte implícitamente al tipo xml .Note that the string is implicitly CAST to xml type.

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

Para proporcionar el XML predeterminado mediante una operación de conversión ( CAST ) explícita a xml, utilice la sintaxis como se muestra en el ejemplo siguiente.To provide the default XML as an explicit CAST to xml, use syntax as shown in the following example.

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

SQL ServerSQL Server también admite restricciones NULL y NOT NULL en columnas de tipo xml . also supports NULL and NOT NULL constraints on columns of xml type. Por ejemplo:For example:

CREATE TABLE T (XmlColumn xml NOT NULL)  

Especificar restriccionesSpecifying Constraints

Al crear columnas de tipo xml , puede definir restricciones de nivel de columna o de nivel de tabla.When you create columns of xml type, you can define column-level or table-level constraints. Las restricciones se emplean en estas situaciones:Use constraints in the following situations:

  • Sus reglas de negocios no se pueden expresar en esquemas XML.Your business rules cannot be expressed in XML schemas. Por ejemplo, la dirección de entrega de una floristería debe estar a menos de 75 kilómetros de su ubicación.For example, the delivery address of a flower shop must be within 50 miles of its business location. Esto se puede escribir como una restricción en la columna XML.This can be written as a constraint on the XML column. La restricción puede afectar a métodos de tipo de datos xml .The constraint may involve xml data type methods.

  • La restricción afecta a otras columnas XML o no XML de la tabla.Your constraint involves other XML or non-XML columns in the table. Un ejemplo puede ser obligar a que el Id. de un cliente (/Customer/@CustId) existente en una instancia XML coincida con el valor de una columna relacional CustomerID.An example is the enforcement of the ID of a Customer (/Customer/@CustId) found in an XML instance to match the value in a relational CustomerID column.

    Puede especificar restricciones para columnas de tipo de datos xml con o sin tipo.You can specify constraints for typed or untyped xml data type columns. Sin embargo, no puede usar los métodos de tipo de datos XML al especificar restricciones.However, you cannot use the XML data type methods when you specify constraints. También debe tener en cuenta que el tipo de datos xml no admite las restricciones de columna y de tabla siguientes:Also, note that the xml data type does not support the following column and table constraints:

  • PRIMARY KEY / FOREIGN KEYPRIMARY KEY/ FOREIGN KEY

  • UNIQUEUNIQUE

  • COLLATECOLLATE

    XML proporciona su propia codificación.XML provides its own encoding. Las intercalaciones solo se aplican a los tipos de cadena.Collations apply to string types only. El tipo de datos xml no es un tipo de cadena.The xml data type is not a string type. No obstante, tiene una representación de cadena y permite la conversión a tipos de datos de cadena y desde tipos de datos de cadena.However, it does have string representation and allows casting to and from string data types.

  • RULERULE

    Una alternativa al uso de restricciones consiste en crear una función de contenedor definida por el usuario para ajustar el método de tipo de datos xml y especificar una función definida por el usuario en la restricción CHECK, como se muestra en el siguiente ejemplo.An alternative to using constraints is to create a wrapper, user-defined function to wrap the xml data type method and specify user-defined function in the check constraint as shown in the following example.

    En el siguiente ejemplo, la restricción de Col2 especifica que cada instancia XML almacenada en esta columna debe tener un elemento <ProductDescription> con un atributo ProductID .In the following example, the constraint on Col2 specifies that each XML instance stored in this column must have a <ProductDescription> element that contains a ProductID attribute. Esta restricción se exige mediante la siguiente función definida por el usuario:This constraint is enforced by this user-defined function:

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

Observe que el método exist() del tipo de datos xml devuelve 1 si el elemento <ProductDescription> de la instancia contiene el atributo ProductID .Note that the exist() method of the xml data type returns 1 if the <ProductDescription> element in the instance contains the ProductID attribute. En caso contrario, devuelve 0.Otherwise, it returns 0.

En este momento, puede crear una tabla con una restricción de columna del modo siguiente:Now, you can create a table with a column-level constraint as follows:

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

La inserción siguiente se realiza correctamente:The following insert succeeds:

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

La inserción siguiente no se realiza correctamente a causa de la restricción:Because of the constraint, the following insert fails:

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

La misma tabla o una tabla diferenteSame or Different Table

Es posible crear una columna de tipo de datos xml en una tabla que contenga otras columnas relacionales o en otra tabla con una relación de clave externa con una tabla principal.An xml data type column can be created in a table that contains other relational columns, or in a separate table with a foreign key relationship to a main table.

Puede crear una columna de tipo de datos xml en la misma tabla si se cumple una de las condiciones siguientes:Create an xml data type column in the same table when one of the following conditions is true:

  • La aplicación efectúa una recuperación de datos en la columna XML y no requiere un índice XML en la columna XML.Your application performs data retrieval on the XML column and does not require an XML index on the XML column.

  • Desea generar un índice XML en la columna de tipo de datos xml y la clave principal de la tabla principal es la misma que su clave de agrupación en clústeres.You want to build an XML index on the xml data type column and the primary key of the main table is the same as its clustering key. Para obtener más información, vea Índices XML (SQL Server).For more information, see XML Indexes (SQL Server).

    Puede crear la columna de tipo de datos xml en otra tabla si se cumplen las condiciones siguientes:Create the xml data type column in a separate table if the following conditions are true:

  • Quiere generar un índice XML en la columna de tipo de datos xml , pero la clave principal de la tabla principal es distinta de su clave de agrupación en clústeres, la tabla principal no tiene una clave principal, o la tabla principal es un montón (sin clave de agrupación en clústeres).You want to build an XML index on the xml data type column, but the primary key of the main table is different from its clustering key, or the main table does not have a primary key, or the main table is a heap (no clustering key). Esto puede ser cierto si la tabla principal ya existe.This may be true if the main table already exists.

  • No desea que se ralenticen los recorridos de las tablas por la presencia de la columna XML en la tabla.You do not want table scans to slow down because of the presence of the XML column in the table. Ésta usa espacio independientemente de si está o no almacenada de manera consecutiva.This uses space whether it is stored in-row or out-of-row.