Creazione di variabili e colonne con tipo di dati XMLCreate XML Data Type Variables and Columns

Il tipo di dati xml è un tipo di dati predefinito di SQL ServerSQL Server ed è simile per alcuni aspetti ad altri tipi predefiniti, quali int e 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. Come per gli altri tipi predefiniti, è possibile usare il tipo di dati xml come tipo di colonna quando si crea una tabella, come tipo di variabile, tipo di parametro, tipo restituito dalla funzione oppure in CAST e 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.

Creazione di colonne e variabiliCreating Columns and Variables

Per creare una colonna di tipo xml come parte di una tabella, usare un'istruzione CREATE TABLE come illustrato nell'esempio seguente: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)   

È possibile usare una DECLARE statement per creare una variabile del tipo xml , come illustrato nell'esempio seguente.You can use a DECLARE statement to create a variable of xml type, as the following example shows.

DECLARE @x xml   

Creare una variabile xml tipizzata specificando una raccolta di XML Schema, come mostrato nell'esempio seguente.Create a typed xml variable by specifying an XML schema collection, as shown in the following example.

DECLARE @x xml (Sales.StoreSurveySchemaCollection)  

Per passare un parametro di tipo xml a una stored procedure, usare un'istruzione CREATE PROCEDURE come illustrato nell'esempio seguente.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 ...   

È possibile utilizzare XQuery per eseguire query su istanze XML archiviate in colonne, parametri o variabili.You can use XQuery to query XML instances stored in columns, parameters, or variables. È inoltre possibile utilizzare il linguaggio XML DML (Data Manipulation Language) per l'applicazione di aggiornamenti alle istanze XML.You can also use the XML Data Manipulation Language (XML DML) to apply updates to the XML instances. Poiché al momento dello sviluppo lo standard XQuery non prevedeva istruzioni DML per il linguaggio XQuery, SQL ServerSQL Server introduce in XQuery le estensioni del linguaggio XML DML (Data Modification Language) .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. Queste estensioni consentono l'esecuzione di operazioni di inserimento, aggiornamento ed eliminazione.These extensions allow you to perform insert, update, and delete operations.

Assegnazione di valori predefinitiAssigning Defaults

All'interno di una tabella è possibile assegnare un'istanza XML predefinita a una colonna di tipo xml .In a table, you can assign a default XML instance to a column of xml type. È possibile fornire dati XML predefiniti in una delle due modalità: usando una costante XML o un cast esplicito 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.

Per fornire dati XML predefiniti come costante XML, utilizzare la sintassi come illustrato nell'esempio seguente.To provide the default XML as an XML constant, use syntax as shown in the following example. Si noti che la stringa è di tipo CAST implicito al tipo xml .Note that the string is implicitly CAST to xml type.

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

Per fornire i dati XML predefiniti come un CAST esplicito a xml, utilizzare la sintassi come illustrato nell'esempio seguente.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 supporta anche i vincoli NULL e NOT NULL sulle colonne di tipo xml . also supports NULL and NOT NULL constraints on columns of xml type. Esempio:For example:

CREATE TABLE T (XmlColumn xml NOT NULL)  

Specifica dei vincoliSpecifying Constraints

Durante la creazione di colonne di tipo xml è possibile definire vincoli a livello di colonna o di tabella.When you create columns of xml type, you can define column-level or table-level constraints. Utilizzare i vincoli nelle situazioni seguenti:Use constraints in the following situations:

  • Le regole business non possono essere espresse negli elementi XML Schema.Your business rules cannot be expressed in XML schemas. Se ad esempio l'indirizzo di recapito di un fiorista deve essere entro 80 Km dal negozio,For example, the delivery address of a flower shop must be within 50 miles of its business location. tale condizione può essere espressa come vincolo sulla colonna XML.This can be written as a constraint on the XML column. Il vincolo può includere metodi per il tipo di dati xml .The constraint may involve xml data type methods.

  • Il vincolo coinvolge altre colonne XML o non XML nella tabella.Your constraint involves other XML or non-XML columns in the table. Un esempio è l'applicazione dell'ID di un cliente (/Customer/@CustId) trovato in un'istanza XML per la corrispondenza con il valore in una colonna relazionale 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.

    È possibile specificare vincoli per le colonne di tipi di dati xml tipizzate o non tipizzate.You can specify constraints for typed or untyped xml data type columns. Nella specifica dei vincoli non è tuttavia possibile usare i metodi con tipo di dati XML .However, you cannot use the XML data type methods when you specify constraints. Si noti anche che il tipo di dati xml non supporta i vincoli di colonna e tabella seguenti: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 fornisce una codifica specifica.XML provides its own encoding. Le regole di confronto sono applicabili unicamente ai tipi stringa.Collations apply to string types only. Il tipo di dati xml non è di tipo stringa.The xml data type is not a string type. Fornisce tuttavia la rappresentazione di stringa e consente il cast a e da i tipi di dati stringa.However, it does have string representation and allows casting to and from string data types.

  • RULERULE

    Un'alternativa all'uso di vincoli è la creazione di un wrapper, una funzione definita dall'utente per eseguire il wrapping del metodo con tipo di dati xml e specificare la funzione definita dall'utente nel vincolo CHECK, come illustrato nell'esempio seguente.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.

    Nell'esempio seguente, il vincolo in Col2 specifica che tutte le istanze XML archiviate nella colonna devono avere un elemento <ProductDescription> contenente un attributo 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. Il vincolo viene imposto da questa funzione definita dall'utente: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  

Si noti che il metodo exist() con tipo di dati xml restituisce 1 se l'elemento <ProductDescription> nell'istanza contiene l'attributo ProductID .Note that the exist() method of the xml data type returns 1 if the <ProductDescription> element in the instance contains the ProductID attribute. In caso contrario, viene restituito 0.Otherwise, it returns 0.

A questo punto è possibile creare una colonna con vincoli a livello di colonna come illustrato di seguito: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  

L'inserimento seguente ha esito positivo:The following insert succeeds:

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

L'inserimento seguente ha invece esito negativo, a causa del vincolo:Because of the constraint, the following insert fails:

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

Utilizzo di un'unica tabella o di più tabelleSame or Different Table

È possibile creare una colonna con tipo di dati xml in una tabella che contiene altre colonne relazionali oppure in una tabella separata con una relazione di chiave esterna con una tabella principale.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.

Creare una colonna con tipo di dati xml nella stessa tabella quando si verifica una delle condizioni seguenti:Create an xml data type column in the same table when one of the following conditions is true:

  • L'applicazione esegue operazioni di recupero dei dati sulla colonna XML e non richiede un indice XML su tale colonna.Your application performs data retrieval on the XML column and does not require an XML index on the XML column.

  • Si vuole compilare un indice XML sulla colonna con tipo di dati xml e la chiave primaria della tabella principale coincide con la chiave di clustering.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. Per altre informazioni, vedere Indici XML (SQL Server).For more information, see XML Indexes (SQL Server).

    Creare la colonna con tipo di dati xml in una tabella separata se si verificano le condizioni seguenti:Create the xml data type column in a separate table if the following conditions are true:

  • Si vuole compilare un indice XML sulla colonna con tipo di dati xml , ma la chiave primaria della tabella principale è diversa dalla chiave di clustering, la tabella principale non ha una chiave primaria, oppure la tabella principale è un heap, ovvero è priva di chiave di clustering.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). Questa situazione può verificarsi quando si utilizza una tabella principale esistente.This may be true if the main table already exists.

  • Si desidera evitare che l'analisi della tabella venga rallentata a causa della presenza della colonna XML,You do not want table scans to slow down because of the presence of the XML column in the table. che utilizza spazio sia che venga archiviata all'interno delle righe che all'esterno delle righe.This uses space whether it is stored in-row or out-of-row.