SQLServerでTransact-SQLからCSV出力する

SQLServer

Transact-SQLステートメントからCSVを出力する方法を紹介します。

コーディング例

BEGIN
  DECLARE @SERVER   VARCHAR(MAX) = 'localhost\MSSQL';
  DECLARE @DATABASE VARCHAR(MAX) = 'TestDB';
  DECLARE @USER_ID  VARCHAR(MAX) = 'sa';
  DECLARE @PASSWORD VARCHAR(MAX) = 'PASS';
  DECLARE @OUTFILE  VARCHAR(MAX) = 'C:\test.csv';
  DECLARE @Items    VARCHAR(MAX) = 'AAA,BBB,CCC,DDD,EEE';

  DECLARE @SQL VARCHAR(8000) = '';
  SELECT
     @SQL += 'SET NOCOUNT ON;'
    ,@SQL += 'SELECT'
    ,@SQL += '  value '
    ,@SQL += 'FROM'
    ,@SQL += '  STRING_SPLIT(''{ITEMS}'','','')'
    ,@SQL += ';'
    ,@SQL = REPLACE(@SQL,'{ITEMS}',@Items);
  ;

  DECLARE @CMD VARCHAR(8000) = '';
  SELECT
     @CMD += 'SQLCMD'
    ,@CMD += ' -S{SERVER}'
    ,@CMD += ' -d{DATABASE}'
    ,@CMD += ' -U{USER_ID}'
    ,@CMD += ' -P{PASSWORD}'
    ,@CMD += ' -q "{SQL}"'
    ,@CMD += ' -s, -W -h -1'
    ,@CMD += ' -o {FILE}'
    ,@CMD = REPLACE(@CMD,'{SERVER}'  ,@SERVER)
    ,@CMD = REPLACE(@CMD,'{DATABASE}',@DATABASE)
    ,@CMD = REPLACE(@CMD,'{USER_ID}' ,@USER_ID)
    ,@CMD = REPLACE(@CMD,'{PASSWORD}',@PASSWORD)
    ,@CMD = REPLACE(@CMD,'{SQL}'     ,@SQL)
    ,@CMD = REPLACE(@CMD,'{FILE}'    ,@OUTFILE)
  ;
  
  EXEC sp_configure 'show advanced options',1;
  RECONFIGURE;
  EXEC sp_configure 'xp_cmdshell',1
  RECONFIGURE;

  EXEC master..xp_cmdshell @CMD;

END

実行結果

test.csv

AAA
BBB
CCC
DDD
EEE

43行目のxp_cmdshellでWindowsコマンドを実行しています。
xp_cmdshellはデフォルトでは使用できませんので、38行目~41行目で使用できるように設定を変更しています。
出力先のパスはSQLServerがインストールされたPC上のパスを指定する必要があります。
以上、「SQLServerでTransact-SQLからCSV出力する」の紹介でした。

 

株式会社システムトラスト

人材募集中です。

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ