@@ ROWCOUNT в OSQL возвращает другой результат, чем в TSQL - PullRequest
0 голосов
/ 07 июля 2010

Я испытываю странное поведение с 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, я ожидаю, что оператор обновления вернет @@ ROWCOUNT, равный 0.

  • 1:

Выполнение вышеуказанного запроса в Query Analyzer дает мне 0 для @@ ROWCOUNT.Это хорошо.

  • Пример 2:

Test.Sql содержит тот же оператор SQL, что и выше.Если я использую следующий оператор OSQL, я также получаю 0 для @@ ROWCOUNT:

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 2 вместо 0?

При первом запуске сценария я получил @@ ROWCOUNT 5, когда обновлялись только три записи.

1 Ответ

4 голосов
/ 07 июля 2010

Пакетные файлы расширяются % до переменной.Вы можете избежать этого, используя двойной %% s:

WHERE GenericField LIKE '%%@%%.%%' 
...