プログラミングと日々思ったことなど

ブログ名通りです。仕事でプログラミングをはじめました。

SqlServerで、ストアドプロシージャを作成 その1

再びストアドを作成したので、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ユーティリティを使っていきます。


続きはまた明日。