SQL Rowcount总是在插入命令时返回1

时间:2011-10-12 23:12:37

标签: sql sql-server-2005 sql-server-2008 rowcount

我想要做的就是将一个变量设置为受事务影响的行数,并将其发送到表中。我不知道为什么我遇到麻烦,但这是我的代码

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 个答案:

答案 0 :(得分:1)

乍一看我没有看到这个问题。我确实创建了一个简单的测试,它似乎工作正常。运行下面的示例进行健全性检查,看看它是否返回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

更新:

问题是你的电话

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

你做@@ RowCount而不是@RowCount。你在proc中的@@ RowCount给出Set @errDate = getdate()

的计数

您需要将proc输入参数更改为@RowCount。

在你的问题中,我认为过程中的一个额外的东西是你投入的,以使你的观点不是真正让你疯狂的部分。这意味着插入后的@@ RowCount将包含正确的值。

答案 1 :(得分:1)

这肯定会工作:

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

因为@@ Rowcount被赋值语句设置为1。因此,第一步是将代码更改为此并坚持下去:

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

如果这仍然没有给出预期结果,您可能会发现您的查询逻辑意外地选择了1行,如@ StarShip3000建议的那样。

答案 2 :(得分:0)

原来是@@ Rowcount的情况,必须是@@ ROWCOUNT