SQL Rowcount всегда возвращает 1 при вставке в команду - PullRequest
2 голосов
/ 13 октября 2011

Все, что я хочу сделать, - это установить переменную на количество строк, затронутых транзакцией, и отправить это в таблицу.Я не знаю, почему у меня проблемы, но вот мой код

Begin

Declare @errDate datetime
Declare @RowCount nvarchar(10)
Declare @Message nvarchar(max)
Declare @startproc datetime
Declare @endproc datetime
Declare @duration int
set @startproc = getdate()

Declare @myDate Datetime

Set @myDate = CAST(CONVERT(varchar,getdate()-1, 112)   +' ' +'00:00 AM'AS DATETIME)

DELETE FROM [Cal_CommOps].[dbo].[Progression_PreCall_CaliforniaECH]
         Where segStart_date = @myDate

INSERT INTO [Cal_CommOps].[dbo].[Progression_PreCall_CaliforniaECH]
           ([callid]
           ,[segstart_date]
           ,[dialed_num]
           ,[origlogin]
           ,[duration])

SELECT  *
FROM               (
Select callid,
         CAST ([SEGSTART_D] as datetime) as segstart_date,
         RIGHT(dialed_num, 10) as dialed_num,
         origlogin,
         duration
FROM [CMS_ECH] ECH
Inner join [Cal_CommOps].[dbo].[CommOps_Emp] EMP on EMP.extension = ECH.origlogin
AND Dept in ('Pre-Call')
Where [SEGSTART_D] = @myDate and dialed_num <> ''

UNION

Select callid,
         CAST ([SEGSTART_D] as datetime) as segstart_date,
         RIGHT(calling_pty, 10) as dialed_num,
         anslogin,
         duration
FROM [CMS_ECH] ECH
Inner join [Cal_CommOps].[dbo].[CommOps_Emp] EMP on EMP.extension = ECH.anslogin
AND Dept in ('Pre-Call')
Where [SEGSTART_D] = @myDate and calling_pty <> ''

                  ) as myCalls

Set @RowCount = @@rowcount
Set @endproc = getdate()
Set @duration = DATEDIFF(minute, @startproc, @endproc)
Set @errDate = getdate()

Exec usp_myDashboardInsert 'PreCall_ECH', @@Rowcount, @errDate, @duration
End

Даже если я попытаюсь

Exec usp_myDashboardInsert 'PreCall_ECH', @Rowcount, @errDate, @duration

, я все равно получу 1.

Почему это так и как мне это исправить?

Если я изменю код и добавлю Select @@ROWCOUNT перед Set @RowCount = @@rowcount, тогда он будет работать, чтобы выбрать его, но я все еще хочу его в переменной.

Ответ: Я думаю, это был случай @@ ROWCOUNT, я использовал @@ Rowcount, и он хотел @@ ROWCOUNT.

Ответы [ 3 ]

1 голос
/ 13 октября 2011

Это определенно не работа:

Exec usp_myDashboardInsert 'PreCall_ECH', @@Rowcount, @errDate, @duration

потому что @@ Rowcount получает значение 1 с помощью операторов присваивания. Итак, первый шаг - изменить код и придерживаться его:

Exec usp_myDashboardInsert 'PreCall_ECH', @Rowcount, @errDate, @duration

Если это все еще не дает ожидаемого результата, вы можете обнаружить, что логика вашего запроса неожиданно выбирает 1 строку, как предлагает @ StarShip3000.

1 голос
/ 13 октября 2011

Я не вижу проблемы на первый взгляд. Я создал простой тест, и он, кажется, работает нормально. Запустите приведенный ниже пример для проверки работоспособности и посмотрите, вернет ли он 2? Если вы запускаете ваш выбор без вставки, вы уверены, что он возвращает более 1 строки?

http://technet.microsoft.com/en-us/library/ms187316.aspx

 CREATE TABLE #Test(id INT, FirstName VARCHAR(MAX))

DECLARE @RowCount nvarchar(10)

INSERT INTO #Test(id,FirstName)
SELECT *
FROM (SELECT 1 as id, 'Fred' as FirstName
      UNION
      SELECT 2,'Dora') as People


SET @RowCount = @@rowcount

SELECT @RowCount

UPDATE:

Вопрос - ваш звонок здесь

Exec usp_myDashboardInsert 'PreCall_ECH', @@Rowcount, @errDate, @duration

Вы делаете @@ RowCount, а не @RowCount. Ваш @@ RowCount в процедуре дает счет от Set @errDate = getdate()

Вам необходимо изменить входной параметр proc на @ RowCount.

В вашем вопросе ко мне я подумал, что прок-колл - это еще одна вещь, которую вы добавили, чтобы сделать вашу точку зрения не той частью, которая сводила вас с ума. Значение вашего @@ RowCount после вставки будет содержать правильное значение.

0 голосов
/ 13 октября 2011

Оказывается, это был случай @@ Rowcount, это должно быть @@ ROWCOUNT

...