【问题标题】:SQL Rowcount always returning 1 on insert into commandSQL Rowcount 在插入命令时总是返回 1
【发布时间】:2011-10-12 23:12:37
【问题描述】:

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

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。

为什么会这样,我该如何解决?

如果我更改代码并在Set @RowCount = @@rowcount 之前添加Select @@ROWCOUNT,那么它可以选择它,但我仍然希望它在一个变量中。

答案:我猜是@@ROWCOUNT 的情况,我使用的是@@Rowcount,它想要@@ROWCOUNT。

【问题讨论】:

  • 当你正常运行那个 SELECT 语句时,你返回了多少行?
  • 大约 1000 行...那么我的代码设置是否正确?
  • Exec usp_myDashboardInsert 'PreCall_ECH', @@Rowcount, @errDate, @duration 肯定 将不起作用,因为 @@ROWCOUNT 的值将被中间语句重置。
  • 好的,谢谢,我在阅读/研究中是这么认为的,但是当我将它设置为变量时,它就不能正常工作了......应该是对的?
  • @CodingIsAwesome - 是的。在insert 的结尾和变量赋值之间根本没有任何其他语句?

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


【解决方案1】:

这肯定不会起作用:

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

因为@@Rowcount 被赋值语句设置为1。所以第一步是把你的代码改成这个并坚持下去:

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

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

【讨论】:

  • 谢谢,当我运行该语句但在结尾处使用 Select @@ROWCOUNT 时,它向我保证已插入 862 行。
  • 注意:如果您选择“选择@@ROWCOUNT”,则会将@@ROWCOUNT 重置为1,因为您要返回一行。 SET 必须是您希望从中计算行数的语句之后的第一个语句。做一组,然后如果你想查看计数,请选择 @ROWCOUNT。
【解决方案2】:

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

在您向我提出的问题中,我认为 proc 调用是您投入的额外内容,以表明您的观点不是让您疯狂的实际部分。这意味着插入后的 @@RowCount 将包含正确的值。

【讨论】:

  • 是的,选择插入但在设置变量之前选择 @@ROWCOUNT 返回 862。您的测试返回 2 :(
【解决方案3】:

原来是@@Rowcount的情况,一定是@@ROWCOUNT

【讨论】:

  • 据我所知@@RowCount 与@@ROWCOUNT 是一回事,您阅读的哪些文档说,根据使用的情况,有两种不同的方法可以获取两个不同的行数?
  • @StarShip3000 - 这不会即使在区分大小写的排序规则上也有任何区别。
  • 尝试将存储行数的变量存储为 nvarchar 而不是 int,并将 @@Rowcount 设为小写。使用 SSMS,这就是我的解决方案。
猜你喜欢
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2018-05-12
  • 2021-09-20
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多