元ネタ: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:他人が作ったやつだと何やってるか分からないし