XML 데이터 인스턴스 만들기Create Instances of XML Data

이 항목은 다음에 적용됩니다.예SQL Server(2008부터)아니요Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse 이 항목에서는 XML 인스턴스를 생성하는 방법에 대해 설명합니다. This topic describes how to generate XML instances.

SQL ServerSQL Server에서 다음과 같은 방법으로 XML 인스턴스를 생성할 수 있습니다.In SQL ServerSQL Server, you can generate XML instances in the following ways:

  • 문자열 인스턴스의 형식 캐스팅Type casting string instances.

  • SELECT 문에 FOR XML 절 사용Using the SELECT statement with the FOR XML clause.

  • 상수 할당 사용Using constant assignments.

  • 대량 로드 사용Using bulk load.

문자열 및 이진 인스턴스의 형식 캐스팅Type Casting String and Binary Instances

문자열을 SQL ServerSQL Server xmlnn][var]char ,char ,varbinary image 와 같은 문자열 데이터 형식을 와 같은 데이터 형식으로 구문 분석할 수 있습니다.You can parse any of the SQL ServerSQL Server string data types, such as [n][var]char, [n]text, varbinary,and image, into the xml data type by casting (CAST) or converting (CONVERT) the string to the xml data type. 형식화되지 않은 XML의 형식이 올바른지 확인하기 위해 검사합니다.Untyped XML is checked to confirm that it is well formed. xml 유형과 관련된 스키마가 있을 경우 유효성 검사도 수행됩니다.If there is a schema associated with the xml type, validation is also performed. 자세한 내용은 형식화된 XML과 형식화되지 않은 XML 비교를 참조하세요.For more information, see Compare Typed XML to Untyped XML.

XML 문서는 UTF-8, UTF-16, windows-1252 등과 같은 다른 인코딩 방식으로 인코딩할 수 있습니다.XML documents can be encoded with different encodings (for example, UTF-8, UTF-16, windows-1252). 다음은 문자열 및 이진 원본 유형이 XML 문서 인코딩과 상호 작용하는 방법 및 파서의 동작 방식에 대한 규칙을 대략적으로 설명한 것입니다.The following outlines the rules on how the string and binary source types interact with the XML document encoding and how the parser behaves.

nvarchar 에서는 UTF-16 또는 UCS-2와 같은 2바이트 유니코드 인코딩을 가정하므로 XML 파서는 문자열 값을 2바이트 유니코드로 인코딩된 XML 문서 또는 조각으로 취급합니다.Since nvarchar assumes a two-byte unicode encoding such as UTF-16 or UCS-2, the XML parser will treat the string value as a two-byte Unicode encoded XML document or fragment. 즉, XML 문서는 원본 데이터 형식과 호환되어야 할 뿐 아니라 2바이트 유니코드 인코딩으로 인코딩해야 합니다.This means that the XML document needs to be encoded in a two-byte Unicode encoding as well to be compatible with the source data type. UTF-16으로 인코딩된 XML 문서는 UTF-16 BOM(바이트 순서 표시)을 포함할 수 있지만 원본 유형의 컨텍스트에 2바이트 유니코드로 인코딩된 문서만 될 수 있다고 명시되어 있으므로 이 BOM을 반드시 포함할 필요는 없습니다.A UTF-16 encoded XML document can have a UTF-16 byte order mark (BOM), but it does not need to, since the context of the source type makes it clear that it can only be a two-byte Unicode encoded document.

varchar 문자열의 내용은 XML 파서에 의해 1바이트로 인코딩된 XML 문서/조각으로 취급됩니다.The content of a varchar string is treated as a one-byte encoded XML document/fragment by the XML parser. varchar 원본 문자열에는 연관된 코드 페이지가 있으므로 파서는 XML 자체에 명시적 인코딩이 지정되지 않은 경우 인코딩에 대해 해당 코드 페이지를 사용하고, XML 인스턴스에 BOM 또는 인코딩 선언이 있는 경우 BOM 또는 선언이 코드 페이지와 일치해야 합니다. 그렇지 않은 경우 파서는 오류를 보고합니다.Since the varchar source string has a code page associated, the parser will use that code page for the encoding if no explicit encoding is specified in the XML itself If an XML instance has a BOM or an encoding declaration, the BOM or declaration needs to be consistent with the code page, otherwise the parser will report an error.

varbinary 의 내용은 XML 파서로 직접 전달되는 코드 포인트 스트림으로 취급됩니다.The content of varbinary is treated as a codepoint stream that is passed directly to the XML parser. 따라서 XML 문서 또는 조각은 BOM 또는 기타 인코딩 정보를 인라인으로 제공해야 합니다.Thus, the XML document or fragment needs to provide the BOM or other encoding information inline. 파서는 이 스트림을 통해서만 인코딩을 파악합니다.The parser will only look at the stream to determine the encoding. 즉, UTF-16으로 인코딩된 XML은 UTF-16 BOM을 제공해야 하고 BOM 및 선언 인코딩이 없는 인스턴스는 UTF-8로 해석됩니다.This means that UTF-16 encoded XML needs to provide the UTF-16 BOM and an instance without BOM and without a declaration encoding will be interpreted as UTF-8.

XML 문서의 인코딩을 미리 알지 못하고 데이터를 XML로 캐스팅하기 전에 데이터가 XML 데이터 대신 문자열이나 이진 데이터로 전달된 경우 해당 데이터를 varbinary로 취급하는 것이 좋습니다.If the encoding of the XML document is not known in advance and the data is passed as string or binary data instead of XML data before casting to XML, it is recommended to treat the data as varbinary. 예를 들어 OpenRowset()을 사용하여 XML 파일에서 데이터를 읽을 때 다음과 같이 해당 데이터가 varbinary(max) 값으로 읽히도록 지정해야 합니다.For example, when reading data from an XML file using OpenRowset(), one should specify the data to be read as a varbinary(max) value:

select CAST(x as XML)   
from OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x)  

SQL ServerSQL Server 에서는 내부적으로 UTF-16 인코딩을 사용하는 효율적인 이진 표현으로 XML을 나타냅니다. internally represents XML in an efficient binary representation that uses UTF-16 encoding. 사용자가 제공한 인코딩은 유지되지 않지만 구문 분석 프로세스 중에 고려됩니다.User-provided encoding is not preserved, but is considered during the parse process.

CLR 사용자 정의 형식 캐스팅Type Casting CLR user-defined types

CLR 사용자 정의 형식에 XML 직렬화가 지정되면 명시적으로 해당 형식의 인스턴스를 XML 데이터 형식으로 캐스팅할 수 있습니다.If a CLR user-defined type has an XML Serialization, instances of that type can be explicitly cast to an XML datatype. CLR 사용자 정의 형식의 XML 직렬화에 대한 자세한 내용은 CLR 데이터베이스 개체에서 XML 직렬화를 참조하세요.For more details about the XML serialization of a CLR user-defined typed, see XML Serialization from CLR Database Objects.

형식화된 XML에서 공백 처리White Space Handling in Typed XML

SQL ServerSQL Server에서 요소 내용 내에 있는 공백은 시작 또는 끝 태그처럼 마크업으로 구분된 공백 전용 문자 데이터 시퀀스 내에 있을 경우와 엔터티화되지 않은 경우 불필요한 것으로 간주됩니다.In SQL ServerSQL Server, white space inside element content is considered insignificant if it occurs inside a sequence of white-space-only character data delimited by markup, such as begin or end tags, and is not entitized. CDATA 섹션은 무시됩니다. 이러한 공백을 처리하는 방식은 W3C(World Wide Web Consortium)에서 게시한 XML 1.0 사양에 설명된 방법과 다릅니다.(CDATA sections are ignored.) This handling of white space handling is different from how white space is described in the XML 1.0 specification published by the World Wide Web Consortium (W3C). 그 이유는 XML 1.0에 설명된 대로 SQL ServerSQL Server의 XML 파서가 제한된 개수의 DTD 하위 집합만 인식하기 때문입니다.This is because the XML parser in SQL ServerSQL Server recognizes only a limited number of DTD subsets, as defined in XML 1.0. SQL ServerSQL Server에서 지원하는 제한된 DTD 하위 집합에 대한 자세한 내용은 CAST 및 CONVERT(Transact-SQL)를 참조하세요.For more information about the limited DTD subsets supported in SQL ServerSQL Server, see CAST and CONVERT (Transact-SQL).

기본적으로 XML 파서는 문자열 데이터를 XML로 변환할 때 다음 중 하나에 해당하면 불필요한 공백을 무시합니다.By default, the XML parser discards insignificant white space when it converts string data to XML if either of the following is true:

  • The xml:space 특성이 한 요소 또는 한 요소의 상위 항목 요소에 정의되어 있지 않습니다.The xml:space attribute is not defined on an element or its ancestor elements.

  • 한 요소 또는 한 요소의 상위 항목 요소 중 하나에 적용된 xml:space 특성에 기본값이 있습니다.The xml:space attribute in effect on an element, or one of its ancestor elements, has the value of default.

    예를 들어For example:

declare @x xml  
set @x = '<root>      <child/>     </root>'  
select @x   

다음은 결과입니다.This is the result:

<root><child/></root>  

그러나 이 동작을 변경할 수 있습니다.However, you can change this behavior. xml DT 인스턴스에 대한 공백을 유지하려면 CONVERT 연산자 및 값 1로 설정된 해당 옵션 style 매개 변수를 사용합니다.To preserve white space for an xml DT instance, use the CONVERT operator and its optional style parameter set to a value of 1. 예를 들어For example:

SELECT CONVERT(xml, N'<root>      <child/>     </root>', 1)  

style 매개 변수가 사용되지 않거나 해당 값이 0으로 설정된 경우 xml DT 인스턴스의 변환에 대해 불필요한 공백이 유지되지 않습니다.If the style parameter is either not used or its value is set to 0, insignificant white space is not preserved for the conversion of the xml DT instance. 문자열 데이터를 xml DT 인스턴스로 변환할 때 CONVERT 연산자 및 해당 style 매개 변수를 사용하는 방법은 CAST 및 CONVERT(Transact-SQL)를 참조하세요.For more information about how to use the CONVERT operator and its style parameter when converting string data to xml DT instances, see CAST and CONVERT (Transact-SQL).

예: 문자열 값을 형식화된 xml로 캐스팅하여 열에 할당Example: Cast a string value to typed xml and assign it to a column

다음 예에서는 XML 조각이 포함된 문자열 변수를 xml 데이터 형식으로 캐스팅한 다음 xml 유형 열에 저장합니다.The following example casts a string variable that contains an XML fragment to the xml data type and then stores it in the xml type column:

CREATE TABLE T(c1 int primary key, c2 xml)  
go  
DECLARE  @s varchar(100)  
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'   

다음 삽입 작업은 문자열에서 xml 유형으로 암시적으로 변환합니다.The following insert operation implicitly converts from a string to the xml type:

INSERT INTO T VALUES (3, @s)   

cast()를 사용하여 문자열을 xml 유형으로 명시적으로 캐스팅할 수 있습니다.You can explicitly cast() the string to the xml type:

INSERT INTO T VALUES (3, cast (@s as xml))  

또는 다음과 같이 convert()를 사용할 수 있습니다.Or you can use convert(), as shown in the following:

INSERT INTO T VALUES (3, convert (xml, @s))   

예: 문자열을 형식화된 xml로 변환하여 변수에 할당Example: Convert a string to typed xml and assign it to a variable

다음 예에서는 문자열이 xml 유형으로 변환되고 xml 데이터 형식의 변수에 할당됩니다.In the following example, a string is converted to xml type and assigned to a variable of the xml data type:

declare @x xml  
declare  @s varchar(100)  
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'   
set @x =convert (xml, @s)  
select @x  

SELECT 문에 FOR XML 절 사용Using the SELECT Statement with a FOR XML Clause

SELECT 문에 FOR XML 절을 사용하여 결과를 XML로 반환할 수 있습니다.You can use the FOR XML clause in a SELECT statement to return results as XML. 예를 들어For example:

DECLARE @xmlDoc xml  
SET @xmlDoc = (SELECT Column1, Column2  
               FROM   Table1, Table2  
               WHERE   Some condition  
               FOR XML AUTO)  
 ...  

SELECT 문이 xml 데이터 형식 변수에 할당하는 동안 구문 분석되는 텍스트 XML 조각을 반환합니다.The SELECT statement returns a textual XML fragment that is then parsed during the assignment to the xml data type variable.

또한 FOR XML 절에 FOR XML 쿼리 결과를 xml 유형으로 직접 반환하는 TYPE 지시어 를 사용할 수 있습니다.You can also use the TYPE directive in the FOR XML clause that directly returns a FOR XML query result as xml type:

Declare @xmlDoc xml  
SET @xmlDoc = (SELECT ProductModelID, Name  
               FROM   Production.ProductModel  
               WHERE  ProductModelID=19  
               FOR XML AUTO, TYPE)  
SELECT @xmlDoc  

다음은 결과입니다.This is the result:

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...  

다음 예에서는 FOR XML 쿼리의 형식화된 xml 결과가 xml 유형 열에 삽입됩니다.In the following example, the typed xml result of a FOR XML query is inserted into an xml type column:

CREATE TABLE T1 (c1 int, c2 xml)  
go  
INSERT T1(c1, c2)  
SELECT 1, (SELECT ProductModelID, Name  
           FROM Production.ProductModel  
           WHERE ProductModelID=19  
           FOR XML AUTO, TYPE)  
SELECT * FROM T1  
go  

FOR XML에 대한 자세한 내용은 FOR XML(SQL Server)을 참조하세요.For more information about FOR XML, see FOR XML (SQL Server).

참고

SQL ServerSQL Server는 TYPE 지시어를 사용하는 FOR XML 쿼리와 같은 여러 서버 생성 결과로 클라이언트에 xml 데이터 형식 인스턴스를 반환합니다. 또는 xml 데이터 형식을 사용하여 SQL 열, 변수 및 출력 매개 변수로부터 XML을 반환합니다. returns xml data type instances to the client as a result of different server constructs such as FOR XML queries that use the TYPE directive, or where the xml data type is used to return XML from SQL columns, variables, and output parameters. 클라이언트 응용 프로그램 코드에서 ADO.NET 공급자는 이 xml 데이터 형식 정보가 서버로부터 이진 인코딩으로 전송되도록 요청합니다.In client application code, the ADO.NET provider requests that this xml data type information be sent in a binary encoding from the server. 하지만 TYPE 지시어 없이 FOR XML을 사용하는 경우 XML 데이터는 문자열 형식으로 반환됩니다.However, if you are using FOR XML without the TYPE directive, the XML data returns as a string type. 클라이언트 공급자는 항상 두 XML 유형 중 하나를 처리할 수 있습니다.In any case, the client provider will always be able to handle either form of XML.

상수 할당 사용Using Constant Assignments

문자열 상수는 xml 데이터 형식의 인스턴스가 예상되는 위치에 사용할 수 있습니다.A string constant can be used where an instance of the xml data type is expected. 이것은 문자열을 XML로 암시적 캐스팅하는 것과 같습니다.This is the same as an implied CAST of string to XML. 예를 들어For example:

DECLARE @xmlDoc xml  
SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'   
-- Or  
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>'  

위의 예에서는 문자열을 xml 데이터 형식으로 암시적으로 변환하여 xml 유형 변수에 할당합니다.The previous example implicitly converts the string to the xml data type and assigns it to an xml type variable.

다음 예에서는 상수 문자열을 xml 유형 열에 삽입합니다.The following example inserts a constant string into an xml type column:

CREATE TABLE T(c1 int primary key, c2 xml)  
INSERT INTO T VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>')   

참고

형식화된 XML의 경우 지정된 스키마에 대해 XML의 유효성이 검사됩니다.For typed XML, the XML is validated against the specified schema. 자세한 내용은 형식화된 XML과 형식화되지 않은 XML 비교를 참조하세요.For more information, see Compare Typed XML to Untyped XML.

대량 로드 사용Using Bulk Load

향상된 OPENROWSET(Transact-SQL) 기능을 사용하면 데이터베이스의 XML 문서를 대량 로드할 수 있습니다.The enhanced OPENROWSET (Transact-SQL) functionality allows you to bulk load XML documents in the database. XML 인스턴스를 파일에서 데이터베이스의 xml 유형 열로 대량 로드할 수 있습니다.You can bulk load XML instances from files into the xml type columns in the database. 작업 샘플은 XML 문서 대량 가져오기 및 내보내기 예제(SQL Server)를 참조하세요.For working samples, see Examples of Bulk Import and Export of XML Documents (SQL Server). XML 문서 로드에 대한 자세한 내용은 XML 데이터 로드를 참조하세요.For more information about loading XML documents, see Load XML Data.

섹션 내용In This Section

항목Topic 설명Description
XML 데이터 검색 및 쿼리Retrieve and Query XML Data XML 인스턴스가 데이터베이스에 저장될 때 보존되지 않는 인스턴스의 일부분에 대해 설명합니다.Describes the parts of XML instances that are not preserved when they are stored in databases.

참고 항목See Also

형식화된 XML과 형식화되지 않은 XML 비교 Compare Typed XML to Untyped XML
xml 데이터 형식 메서드 xml Data Type Methods
XML DML(XML 데이터 수정 언어) XML Data Modification Language (XML DML)
XML 데이터(SQL Server)XML Data (SQL Server)