Проблема SQL DELETE STATEMENT с возвращенным счетчиком строк - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть такое утверждение:

DELETE TABLENAME WHERE COLUMN = NUMBER; SELECT @@ROWCOUNT AS RC;

если я запускаю его из кода (классический asp), я получаю сообщение об ошибке: Item cannot be found in the collection corresponding to the requested name or ordinal.

БД - это sql server 2005 express.

если я запускаю эту строку в анализаторе запросов, она работает!

столбец, на который я ссылаюсь, имеет ограничение на другую таблицу в БД

Вы, ребята, знаете, где искать стат для поиска исправления для него?

ОБНОВЛЕНИЕ - пожалуйста, попробуйте объяснить это сейчас

первая строка - это строка подключения, которая была у нас на обычных серверах, когда нам нужно было загрузить код на новый сервер с SQL Server Express, мы перешли на второй, потому что первый у нас не работал (я попробовал в servername local ip: 127.0.0.1) а второй был реальным именем сервера. Теперь я изменил первый, чтобы подключиться к имени сервера, и он работает. даже удаляя и получая @@ rowcount. но теперь похоже на медленное соединение, поэтому сайт работает медленно!

есть идеи по улучшению?

ConnectionString =  "Server=**ServerName**;Driver={SQL Server};UID=**Username**; PWD=**password**;database=**dbname**;Data Provider=SQLOLEDB;Network Library=DBMSSOCN;"

ConnectionString = "PROVIDER=SQLOLEDB; Data Source =**servername**; Trusted_Connection=Yes; Initial Catalog=**dbname**;User Id=**username**; Password=**password**;"

Ответы [ 4 ]

1 голос
/ 28 сентября 2011

Если вы хотите посчитать количество затронутых строк, вы можете использовать это вместо:

conn.Execute("DELETE FROM TABLENAME WHERE COLUMN = " & number, rows_affected)

Response.Write rows_affected
1 голос
/ 28 сентября 2011

Добавить SET NOCOUNT ON;, поскольку без этого возвращается другой набор записей, вызывающий проблему

SET NOCOUNT ON;DELETE TABLENAME WHERE COLUMN = NUMBER; SELECT @@ROWCOUNT AS RC;
0 голосов
/ 28 сентября 2011

В этом коде предполагается, что в запросе есть два набора записей, первый из которых, вероятно, является счетчиком строк (почему люди предлагают SET NOCOUNT ON).

m_Conn.Execute(strSql).NextRecordset.Fields(strReturnedValueName).Value 

, поэтому он будет выполняться и не будет возвращать значение (этот код работает на сотнях наших веб-сайтов, но теперь на новом сервере он не работает -

Когда вы запускаете код наэтот сервер, показывает ли он количество строк? Если нет, то что-то включает NOCOUNT, поэтому ваш код ASP не возвращает ожидаемое количество объектов набора записей. Вместо того, чтобы предполагать, что вы всегда получите два набора записей обратно, я бы зациклилсячерез набор записей, пока возвращенный набор записей не станет пустым, что-то вроде этих строк. Приведенный ниже код не тестируется, он в основном захватывает первое поле из каждого набора записей до последнего. Таким образом, независимо от настройки NOCOUNT, вы должны всегдаполучить значение из вашего окончательного оператора SQL

DIM rs 
set rs=Server.CreateObject("ADODB.recordset")
set rs = m_Conn.Execute(strSql)
do while rs is not nothing
  val = rs(0).value
  rs = rs.NextRecordSet
enddo
0 голосов
/ 28 сентября 2011

@@ Rowcount - это вызов T-SQL, который может выполняться только из базы данных. Вы можете создать его экземпляр в сохраненном процессе, а затем вызвать удаление и вернуть @@ rowcount из сохраненного процесса.

Это для ASP.NET, но вместо записи в загрузку страницы просто обработайте его в заголовке

http://support.microsoft.com/kb/306574

...