출처 : http://laigo.kr/723


SQL Server 2012 에서 XML 문서를 테이블에 Bulk Insert 하는 방법과 XQuery 를 사용하여 XML 데이터를 검색하는 몇 가지 예제를 아래와 같이 정리하였습니다.

 

 

1. XML 원본 문서를 테이블에 Bulk Insert 하는 방법

CREATE DATABASE XMLDB
GO

 

USE XMLDB
GO

 

CREATE TABLE TBL_XML (
 ID  INT IDENTITY PRIMARY KEY,
 XMLDATA XML 
)
GO

INSERT INTO TBL_XML(XMLDATA) 
SELECT * FROM OPENROWSET (
     BULK 'D:\SQL\BOOKS.XML', SINGLE_BLOB) AS x;

 

 

 

2. XQuery 를 사용하여 XML 데이터 검색 예제 

CREATE TABLE TBL_XQUERY (
 ID  INT IDENTITY PRIMARY KEY,
 XMLDATA XML 
)
GO

INSERT INTO TBL_XQUERY VALUES ('
 <CATALOG> 
  <book id="bk101">
   <author>Gambardella, Matthew</author>
   <title>XML Developer''s Guide</title>
   <genre>Computer</genre>
   <price>44.95</price>
   <publish_date>2000-10-01</publish_date>
   <description>An in-depth look at creating applications with XML.</description>
  </book> 
 </CATALOG>
')

INSERT INTO TBL_XQUERY VALUES ('
 <CATALOG> 
  <book id="bk102">
    <author>Ralls, Kim</author>
    <title>Midnight Rain</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-12-16</publish_date>
    <description>A former architect battles corporate zombies, n evil sorceress, and her own childhood to become queen of the world.</description>
  </book>
 </CATALOG>
')

INSERT INTO TBL_XQUERY VALUES ('
 <CATALOG> 
    <book id="bk103">
    <author>Corets, Eva</author>
    <title>Maeve Ascendant</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-11-17</publish_date>
    <description>After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.</description>
    </book>
 </CATALOG>
')

 

 

SELECT XMLDATA.query('/CATALOG/book')
FROM TBL_XQUERY
WHERE ID = 2
/*
<book id="bk102">
  <author>Ralls, Kim</author>
  <title>Midnight Rain</title>
  <genre>Fantasy</genre>
  <price>5.95</price>
  <publish_date>2000-12-16</publish_date>
  <description>A former architect battles corporate zombies, n evil sorceress, and her own childhood to become queen of the world.</description>
</book>
*/

 


SELECT XMLDATA.value ( '(/CATALOG/book/@id)[1]', 'char(5)' ) AS 'Book id'
FROM TBL_XQUERY
/*
bk101
bk102
bk103
*/

 


SELECT XMLDATA 
FROM TBL_XQUERY
WHERE XMLDATA.exist('/CATALOG/book[@id="bk103"]') = 1
/*
<CATALOG>
  <book id="bk103">
    <author>Corets, Eva</author>
    <title>Maeve Ascendant</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-11-17</publish_date>
    <description>After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.</description>
  </book>
</CATALOG>
*/

 


SELECT 
 nCol.value('@id', 'char(5)') AS 'Book id', 
 nCol.value('(author)[1]', 'varchar(10)') AS author,
 nCol.value('(title)[1]', 'varchar(50)') AS title,
 nCol.value('(genre)[1]', 'varchar(10)') AS genre
FROM TBL_XQUERY 
CROSS APPLY XMLDATA.nodes('/CATALOG/book') AS nTbl(nCol)
ORDER BY ID
/*
bk101 Gambardell XML Developer's Guide Computer
bk102 Ralls, Kim Midnight Rain   Fantasy
bk103 Corets, Ev Maeve Ascendant   Fantasy
*/

 

 

 

[참고자료]

Examples of Bulk Import and Export of XML Documents (SQL Server)
http://msdn.microsoft.com/en-us/library/ms191184.aspx

 

XQuery 언어 참조(SQL Server)
http://msdn.microsoft.com/ko-kr/library/ms189075.aspx

 

SQL

서버 개발하다 보면 DB에 내장 프로시저가 많아지는데
이것도 나중에 관리하는게 일이 되어 버린다.

하여튼, 특정 단어가 쓰였는지 확인하려면

--내장 프로시저 검색
SELECT * FROM sysobjects WHERE id IN (
 SELECT id FROM syscomments WHERE text LIKE '%검색할 단어%'
)

위 쿼리를 실행시키면 된다.

그대로 복사해서 검색할 단어에 프로시저에서 사용할법한
(SELECT 나 UPDATE 등 테이블 조작하는 필드명을 검색한다거나...)
단어를 넣어서 실행하면
결과 테이블이 뜨는데, 그 내장 프로시저를 찾아가면 된다.

#include <stdio.h>
#include <errno.h>
#include <mysql.h>

MYSQL mysql;

// 쿼리 질의를 한다
void sql_qur(char *sql_query)
{
     printf("input sql query is %s\n", sql_query);
     if( mysql_real_query(&mysql, sql_query, strlen(sql_query)) )
     {
          perror( mysql_error(&mysql) );
          exit( 1 );
     }
}

// 쿼리 질의로 온 결과를 모두 출력한다.
void sql_print_result(char *result)
{
     MYSQL_RES *res;
     MYSQL_ROW row;
     MYSQL_FIELD *fld;
     int fields;

     if( !(res=mysql_store_result(&mysql)) )
     {
          perror( mysql_error(&mysql) );
          exit( 1 );
     }
 
     sprintf(result, "");

     while( (row=mysql_fetch_row(res)) )
     {
          int     i;
     
          for( i=0 ; i<mysql_num_fields(res) ; i++ )
          {
              fld = mysql_fetch_field_direct( res, i );

              if(i == 0)
                  sprintf( result, "%s%20s: %s", result, fld->name, row[i] );
              else
                  sprintf( result, "%s\n%20s: %s", result, fld->name, row[i] );

              if( !strlen(row[i]) )
              {
                  mysql_free_result(res);
                  mysql_close(&mysql);
                  exit(0);
              }
          }
          sprintf( result, "%s\n\n", result );
      }

      mysql_free_result(res);
}

// 쿼리를 받음 단, 한줄에 한개의 쿼리가 찍힌다
void sql_get_result(char *result)
{
        MYSQL_RES *res;
        MYSQL_ROW row;
        int line = 0;
 
        if( !(res=mysql_store_result(&mysql)) )
        {
                perror( mysql_error(&mysql) );
                exit( 1 );
        }
 
        sprintf(result, "");
 
        while( (row=mysql_fetch_row(res)) )
        {
                int     i;
 
                for( i=0 ; i<mysql_num_fields(res) ; i++ )
                {
                        if(i == 0 && line == 0)
                               sprintf( result, "%s", row[i] );
                        else
                               sprintf( result, "%s\n%s", result, row[i] );
 
                        if( !strlen(row[i]))
                        {
                                mysql_free_result(res);
                                mysql_close(&mysql);
                                exit(0);
                         }
                 }
                ++line;
        }
        result[strlen(result)] = '\0';
        mysql_free_result(res);
}

void main(void)
{
        char input_query[100];
        mysql_init( &mysql );

        if( !mysql_real_connect(&mysql,
           "localhost",            // host
           "user",          // user
           "pw",       // passwd
           "db_name",          // db
           3306,                   // port
           NULL,
           0) )
        {
         perror( mysql_error(&mysql) );
         exit( 1 );
        }

        // user 테이블을 출력한다.
        sql_qur("select * from user;");
        sql_print_result(&input_query);
        printf("sql result %s\n", input_query);
 
        // test01 ID에 대한 password 값을 구한다.
        sql_qur("select password from user where ID='test01';");
        sql_get_result(&input_query);
        printf("sql result %s\n", input_query);
 
        // 질의를 입력 받아서 그 결과를 계속 출력
        while(1)
        {
                printf("input sql query! : ");
                sql_qur(gets(input_query));

                sql_get_result(&input_query);
                printf("\nsql result %s\n", input_query);
        }

        mysql_close(&mysql);
}


+ Recent posts