-1

OSQLで奇妙な動作が発生しているので、助けていただければ幸いです。

データベースフィールドをある列から別の列にコピーするバッチファイルがあります。サンプルスクリプトは次のとおりです。

SET NOCOUNT ON; 
UPDATE Table1 SET Table1.EmailAddress = Table2.GenericField FROM Table1
INNER JOIN Table2 ON Table1.ID = Table2.ID WHERE GenericField LIKE '%@%.%' 
   AND EmailAddress IS NULL;
SELECT @@ROWCOUNT;

すべてのEmailAddressフィールドがNULLではなくなったとすると、updateステートメントは@@ROWCOUNT0を返すと思います。

  • 例1:

上記のクエリをクエリアナライザで実行すると、@@ROWCOUNTに0が返されます。それは良い。

  • 例2:

Test.Sqlには、上記とまったく同じSQLステートメントが含まれています。次のOSQLステートメントを使用すると、@@ROWCOUNTにも0が返されます。

osql.exe -D TestConn -U UserID -P pwd -s , -h-1 -w 100 -n ^
    -i "C:\Scripts\Test.sql"
  • 例3:

SQLファイルではなくバッチファイルにSQLステートメントがある場合、@@ROWCOUNTは2になります。

osql.exe -D TestConn -U UserID -P pwd -s , -h-1 -w 100 -n -Q ^
  "SET NOCOUNT ON; 
   UPDATE Table1 SET Table1.EmailAddress = Table2.GenericField FROM Table1
   INNER JOIN Table2 ON Table1.ID = Table2.ID WHERE GenericField LIKE '%@%.%' 
      AND EmailAddress IS NULL;
   SELECT @@ROWCOUNT;" 

たとえば3のようにスイッチを間違って設定していませんか?@@ ROWCOUNTが0ではなく2になるのはなぜですか?

スクリプトを初めて実行したとき、更新されたレコードが3つだけのときに、@@ROWCOUNTが5になりました。

4

1 に答える 1

4

バッチファイル%は変数に展開されます。doublesを使用してエスケープできます%%

WHERE GenericField LIKE '%%@%%.%%' 
于 2010-07-06T20:27:14.673 に答える