「SQLCMD を使用して DB 単位の件数をテキストファイルに取得する」 を バッチ化してみる

元ネタ:SQLCMD を使用して DB 単位の件数をテキストファイルに取得する | SE の雑記

.NET のコンソールアプリで書けばさくっと出来そうなんですが、.exe 叩くのなんか嫌*1 & カスタマイズ出来ないのでバッチ化してみました。

del main.sql
echo SET NOCOUNT ON >> main.sql
echo GO >> main.sql
echo SELECT >> main.sql
echo     DB_NAME() AS DbName, >> main.sql
echo     SCHEMA_NAME(so.schema_id) AS SchemaName, >> main.sql
echo     so.name, >> main.sql
echo     dps.* >> main.sql
echo FROM >> main.sql
echo     sys.dm_db_partition_stats dps >> main.sql
echo     INNER JOIN >> main.sql
echo     sys.objects so ON >> main.sql
echo     so.object_id = dps.object_id >> main.sql
echo     AND >> main.sql
echo     SCHEMA_NAME(so.schema_id) ^<^> 'sys' >> main.sql
echo WHERE index_id IN(0, 1) >> main.sql
echo ORDER BY so.name >> main.sql

del generate.sql

echo SET NOCOUNT ON >> generate.sql
echo GO >> generate.sql
echo.   >> generate.sql
echo DECLARE @dbname sysname >> generate.sql
echo DECLARE @outfilename sysname >> generate.sql
echo DECLARE @sqlfilename sysname >> generate.sql
echo.   >> generate.sql
echo SET @outfilename = 'table_count_' >> generate.sql
echo SET @sqlfilename = 'main.sql' >> generate.sql
echo.   >> generate.sql
echo DECLARE DBCURSOR CURSOR FOR >> generate.sql
echo SELECT name FROM sys.databases WHERE database_id ^>= 5 >> generate.sql
echo.   >> generate.sql
echo OPEN DBCURSOR >> generate.sql
echo FETCH NEXT FROM DBCURSOR >> generate.sql
echo INTO @dbname >> generate.sql
echo.   >> generate.sql
echo WHILE @@FETCH_STATUS = 0 >> generate.sql
echo BEGIN >> generate.sql
echo     PRINT 'sqlcmd -S .\MSSQL2012 -E -s "  " -W -d ' + @dbname + ' -i ' + @sqlfilename + ' -o ' + @outfilename + @dbname + '.txt' >> generate.sql
echo     FETCH NEXT FROM DBCURSOR >> generate.sql
echo     INTO @dbname >> generate.sql
echo END >> generate.sql
echo CLOSE DBCURSOR >> generate.sql
echo DEALLOCATE DBCURSOR >> generate.sql

del run.bat
sqlcmd -S .\MSSQL2012 -i generate.sql >> run.bat

call run.bat
del main.sql
del generate.sql
del run.bat

このバッチ叩くと、必要な SQL ファイル、.bat ファイルを生成して、終わったら生成したファイルは消してます。
なるべく元のクエリのままにしたかったのですが、

echo  ON > main.sql

が出力できなかったので、ON の位置だけ変えてます。 利用する時は、SQL Server のサーバー名は適当に変更してくださいなー。

*1:他人が作ったやつだと何やってるか分からないし