2

私がやりたいことは、変数をトランザクションの影響を受ける行数に設定し、それをテーブルに送信することだけです。なぜ問題があるのか​​ わかりませんが、ここに私のコードがあります

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 が必要でした。

4

3 に答える 3

1

私は一見問題を見ていません。簡単なテストを作成しましたが、正常に機能しているようです。以下の例を実行して健全性チェックを行い、2が返されるかどうかを確認します。挿入せずにselectを実行すると、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

アップデート:

問題はここでのあなたの電話です

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

@RowCountではなく@@RowCountを実行します。procの@@RowCountは、からのカウントを与えていますSet @errDate = getdate()

proc入力パラメーターを@RowCountに変更する必要があります。

私へのあなたの質問では、proc呼び出しは、あなたがあなたに夢中になっている実際の部分ではなく、あなたの主張を明確にするためにあなたが投げ込んだ余分なものだと思いました。挿入後の@@RowCountには、正しい値が含まれます。

于 2011-10-12T23:28:31.110 に答える
1

これは間違いなく機能しません:

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

@@ Rowcountは、代入ステートメントによって1に設定されるためです。したがって、最初のステップは、コードをこれに変更して、それを維持することです。

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

それでも期待どおりの結果が得られない場合は、@ StarShip3000が示唆しているように、クエリロジックが予期せず1行を選択していることに気付く場合があります。

于 2011-10-12T23:37:55.227 に答える
0

@@Rowcount の場合であることがわかりました。@@ROWCOUNT である必要があります。

于 2011-10-12T23:50:15.367 に答える