반응형


김종열

MS SQL Server MVP

엔트리브 소프트


커뮤니티에서 자주 오르는 질문 중의 하나지요. 쿼리의 결과를 파일로 만들수 없는지..
물론 bcp등을 이용한 동적SQL문으로 만들면 얼마든지 가능합니다.
이번에 만들어본 저장프로시져가 그런 의도로 만들어본 겁니다.
좀더 쉽게 만들어야 한다는 압박을 가지며 작성을 했습니다.
또한 파일은 overWrite모드로 되어 있기에 실무에 사용하실 때는 검증후 하시길 추천드립니다.
간략한 구조를 설명드리면
1. 인자를 받아 검사를 해주고
2. Dataset을 만드는 부분
3. Dataset을 이용해서 파일에 기록하는 부분
이 세구조로 되어 있습니다.

역시 자세한 설명을 드리지 않는 것은 프로그램적인 부분이기 때문에 논외 사항이라 여기기 떄문입니다.


using System;

using System.Data;

using System.Data.SqlClient;

using System.Data.SqlTypes;

using Microsoft.SqlServer.Server;

using System.Collections;

using System.Text;

using System.IO;

using System.Security;

using System.Security.Permissions;

 

public partial class StoredProcedures

{

    [Microsoft.SqlServer.Server.SqlProcedure]

    public static void USP_WRITE_FILE(SqlString SqlSelect, SqlString FullPath)

    {

       

        if (SqlSelect.IsNull || FullPath.IsNull)

        {

            SqlContext.Pipe.Send("Wrong Parameter!");

        }

        else

        {

            string select = SqlSelect.ToString();

 

            DataSet _sqlDS = GetDataSetWithSQL(select);

            CreateFile(_sqlDS, FullPath.ToString());

            SqlContext.Pipe.Send("Saving Complete");

            _sqlDS.Dispose();

        }

 

    }

 

    public static DataSet GetDataSetWithSQL(string _sql)

    {

        SqlDataAdapter _sqlDA = new SqlDataAdapter();

        DataSet _sqlDS = new DataSet();

        SqlConnection _sqlConn = new SqlConnection("Context Connection=True");

 

        SqlCommand _sqlCmd = new SqlCommand(_sql, _sqlConn);

        _sqlDA.SelectCommand = _sqlCmd;

        _sqlDA.Fill(_sqlDS, "TABLE");

        _sqlConn.Close();

 

        return _sqlDS;       

    }

 

    public static void CreateFile(DataSet _myDS, String FullPath)

    {

        int i = 0;

        int fldCnt = 0;

 

        StreamWriter sw = new StreamWriter(FullPath, true);

 

        fldCnt = _myDS.Tables[0].Columns.Count;

 

        //Head 출력

        for (int x = 0; x <= fldCnt - 1; x++)

        {

            sw.Write("[" + _myDS.Tables[0].Columns[x].ColumnName + "]");

            if (x < fldCnt - 1)

                sw.Write(",");           

        }

 

        sw.Write(sw.NewLine);

 

        //Table Data

        for (int x = 0; x <= _myDS.Tables["TABLE"].Rows.Count - 1; x++)

        {

            while (i < fldCnt)

            {

                if (!Convert.IsDBNull(_myDS.Tables["TABLE"].Rows[x][i]))

                {

                    sw.Write(Convert.ToString(_myDS.Tables["TABLE"].Rows[x][i]));

                }

                if (i < fldCnt - 1)

                    sw.Write(",");

                i++;

            }

            i = 0;

            sw.Write(sw.NewLine);

        }

 

        sw.Close();

    }

};

 



다 입력을 하셨다면 배포를 해주십시오.

그리고 query analyze에서

declare @sql varchar(4000)

       , @path varchar(4000)

      

select @sql = 'select * from pubs.dbo.titles'

       , @path = 'C:\LECTURE_CLR\pubs_title.txt'

 

exec dbo.usp_write_file @sql, @path


이런 쿼리하나 실행해보십시오.
그리고 경로에 저장되어 있는 파일을 확인해보십시오.

좋은 하루 되십시오.
오랜만에 파일도 하나 첨부해볼께요.

반응형

+ Recent posts