2

TSQLプログラムを呼び出すために使用したいDOSバッチファイルがあります。使用するデータベースの名前を渡したい。これはうまくいくようです。使用するテーブルの名前にプレフィックスを渡したい。したがって、テストテーブルの場合、テストテーブルを使用するためにプレフィックスの名前を渡します。

set svr=myserver
rem set db=myTESTdatabasename
set db=mydatabasename
rem set tp=TEST
set tp=
sqlcmd -S %svr% -d somename -i test01.sql

test01.sqlは次のようになります。

use $(db)
go

select top 10 * into $(db).dbo.$(tp)dsttbl from $(db).dbo.$(tp)srctbl

テスト用には問題なく動作しますが、実際の場合は、tpの値をnullに設定して、偽のテーブル名ではなく実際のテーブル名を使用するようにします。

私がこれを行っている理由は、実際のデータベースで使用されるすべての名前がわからないためです。私はそれを一般的にしようとしているので、非常に大きなSQLプログラムになるものを検索して置き換える必要はありません(実際のSQLプログラムはすでに数百行です)。

テストケースでは、これは次のように解決されます

select top 10 * into myTESTdatabasename.dbo.TESTdsttbl from myTESTdatabasename.dbo.TESTsrctbl

本番稼働の場合、次のように解決する必要があります

select top 10 * into mydatabasename.dbo.dsttbl from mydatabasename.dbo.srctbl

問題は、$(tp)のnull値が気に入らないか、未定義の変数を取得しているようです。

4

1 に答える 1

2

構文をいくつか試してみましたが、Preet Sangha が指摘したように、/V コマンド ライン オプションを使用する必要があります。

これは、バッチ スクリプトで変数を空の文字列に設定すると、その変数が未定義になるためです。

バッチ ファイルの先頭にデータベース名を設定する場合は、次のように set を使用できます。

set db_to_use=

次に、/V オプションを使用して、sqlcmd でこの (未定義の) 変数を使用できます。

sqlcmd -S %svr% -d somename -v db="%db_to_use%" -i test01.sql

...または、sqlcmd 行で値を直接設定することもできます。

sqlcmd -S %svr% -d somename -v db="" -i test01.sql
于 2013-05-03T06:34:47.453 に答える