フィールドサイズを変更する SQL がわからない

同じ名称のフィールドがいくつものテーブルにあるので、ひとつひとつサイズを変更していくのは、ちょっと大変。。。


なので、SQL で一発で何とかしたいなぁと思ったんだけど、どうすればいいのか。


もう少し調べてみる!

                                                                      • -

できた><

-- 変数宣言
DECLARE @tbl_name VARCHAR(50)
DECLARE @fld_name VARCHAR(50)

-- フィールド名設定
SET @fld_name = 'hoge'

-- ユーザー定義のテーブルを抽出
DECLARE cursor_name CURSOR FOR SELECT NAME FROM sysobjects WHERE xtype = 'U' ORDER BY NAME

OPEN cursor_name
FETCH NEXT FROM cursor_name INTO @tbl_name
WHILE @@FETCH_STATUS = 0
BEGIN

	-- 指定フィールドが存在する場合
	IF EXISTS(
		SELECT   obj.name
		       , col.name
		  FROM syscolumns AS col
		 INNER JOIN sysobjects AS obj
	            ON col.id = obj.id
		 WHERE obj.type = 'U'
		   AND obj.name = @tbl_name 
		   AND col.name = @fld_name
	)
	BEGIN

		-- プリント
		PRINT @tbl_name + N' の ' + @fld_name + N' のサイズを 2 から 3 に変更します。'

		-- 指定フィールドの型を varchar(3) に変更する。
		EXEC ('ALTER TABLE ' + @tbl_name + ' ALTER COLUMN ' + @fld_name + ' varchar(3)')

		-- 列プロパティ(拡張プロパティ)の説明が空白の場合
		IF (SELECT ISNULL(
			(SELECT ex.value 
			   FROM sys.extended_properties AS ex 
			  WHERE col.id = ex.major_id 
			    AND ex.minor_id = col.colid 
			    AND ex.name = 'MS_Description' ),''
			) 
			 FROM syscolumns AS col
			INNER JOIN sysobjects AS obj  
			   ON col.id = obj.id
			WHERE obj.name = @tbl_name 
			  AND col.name = @fld_name ) = ''
		BEGIN
			-- INSERT
			EXEC sys.sp_addextendedproperty 
				   @name = N'MS_Description'
				 , @value = N'2009/01/20 サイズを 2 → 3 に変更'
				 , @level0type=N'SCHEMA'
				 , @level0name=N'dbo'
				 , @level1type = N'TABLE' 
				 , @level1name = @tbl_name
				 , @level2type = N'COLUMN' 
				 , @level2name = @fld_name;
		END
		ELSE
		BEGIN
			-- UPDATE
			EXEC sys.sp_updateextendedproperty 
				   @name = N'MS_Description'
				 , @value = N'2009/01/20 サイズを 2 → 3 に変更'
				 , @level0type=N'SCHEMA'
				 , @level0name=N'dbo'
				 , @level1type = N'TABLE' 
				 , @level1name = @tbl_name
				 , @level2type = N'COLUMN' 
				 , @level2name = @fld_name;
		END
	END

	FETCH NEXT FROM cursor_name INTO @tbl_name
END
CLOSE cursor_name

DEALLOCATE cursor_name