再びストアドを作成したので、2回に渡って復習します。
今回は、カーソル作成までです。
CREATE PROCEDURE SP_ABC ( @file_name VARCHAR(50) ,@table_name VARCHAR(50) ,@out_folder VARCHAR(20) -- 出力先フォルダ(フルパス) ,@S_name VARCHAR(30) ,@U_id VARCHAR(20) ,@pass VARCHAR(20) ,@header CHAR(1) ,@R_Msg VARCHAR(1000) OUTPUT -- 返却メッセージ ) AS DECLARE @hed_str NVARCHAR(3000) -- ↑カーソルからfetchしてきた情報をカンマ区切りで格納 DECLARE @hed_get VARCHAR(50) -- ↑列のヘッダーを格納 DECLARE @SQL NVARCHAR(1000) -- SQL...は、SQL文を格納 DECLARE @SQL_header NVARCHAR(1000) DECLARE @SQL_cursor NVARCHAR(1000) DECLARE @SQL_heder_edit NVARCHAR(1000) DECLARE @BCP_str VARCHAR(3000) DECLARE @File_copy VARCHAR(3000) DECLARE @File_Del VARCHAR(3000) DECLARE @R_value int --戻り値 DECLARE @D_Msg VARCHAR(100) DECLARE @result int DECLARE @Cnt INTEGER BEGIN SET @D_Msg = 'ストアドエラー発生' SET @R_value = -1 BEGIN TRY -- テーブルデータ存在確認 SET @SQL = N' SELECT * FROM ' + @table_name EXECUTE sp_executesql @SQL --SQL実行 SET @Cnt = @@ROWCOUNT IF @Cnt = 0 BEGIN SET @R_Msg = 'データなし' + @table_name RETURN @R_value END -- データ抽出SQL作成 IF @header = 1 BEGIN SET @SQL_header = N' SELECT d.name FROM Sys.tables AS t LEFT OUTER JOIN sys.columns AS c ON t.id = c.id WHRER t.name = ''' + @table_name + '''' + N' ORDER BY c.column_nm ' -- ↑ここがわかりづらい -- テーブルの名前を条件にして、カラムとテーブルを結合 -- Sys.tablesというのはカタログビューと言う。 -- カタログビューは、SqlServerデータベースエンジンによって使用される情報を返す。 EXECUTE sp_executesql @SQL_header SET @SQL_cursor = N' DECLARE aa CURSOR FOR ' + @SQL_header -- ↑先ほど外部結合させるSQL文をカーソルの条件にしている。 EXECUTE sp_executesql @SQL_cursor OPEN aa FETCH NEXT FROM aa INTO @hed_get IF @@FETCH_STATUS = 0 BEGIN SET @hed_str += @hed_get END WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM aa INTO @hed_get SET @hed_str += ',' + @hed_get END CLOSE aa DECLARE aa SET @SQL_heder_edit = N'SELECT ' + '''' + @hed_str + '''' END
以上で、カンマ区切りのSELECT文を作成することができました。
これを、csvに出力させるためにbcpユーティリティを使っていきます。
続きはまた明日。