Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在表中插入数据时获取表的行数_Sql_Sql Server_Database_Count - Fatal编程技术网

Sql 在表中插入数据时获取表的行数

Sql 在表中插入数据时获取表的行数,sql,sql-server,database,count,Sql,Sql Server,Database,Count,下面是示例数据和模式 CREATE TABLE [dbo].[Customer]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](500) NOT NULL, [IsDelete] [bit] NOT NULL, CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,

下面是示例数据和模式

CREATE TABLE [dbo].[Customer]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](500) NOT NULL, [IsDelete] [bit] NOT NULL, 
CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Invoice]([Id] [int] IDENTITY(1,1) NOT NULL,[CustomerId] [int] NOT NULL, [Amount] [decimal](18, 2) NOT NULL,
 CONSTRAINT [PK_Invoice] PRIMARY KEY CLUSTERED 
( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
GO

Insert Into Customer (Name)
Values
('Jhon'),('-Jack'),('Mary'),('-Sam');

Insert into Invoice (CustomerId,Amount)
Values (1, 22.00),(1, 34.50),(2,20.67),(2,34.67),(3,45.89),(3,20.00),(4,30.00),(4,20.00)

ALTER TABLE [dbo].[Customer] ADD  CONSTRAINT [DF_Customer_IsDelete]  DEFAULT ((0)) FOR [IsDelete]
GO
ALTER TABLE [dbo].[Invoice]  WITH CHECK ADD  CONSTRAINT [FK_Invoice_Invoice] FOREIGN KEY([CustomerId])
REFERENCES [dbo].[Customer] ([Id])
GO
ALTER TABLE [dbo].[Invoice] CHECK CONSTRAINT [FK_Invoice_Invoice]
GO
我有以下SQL查询

DECLARE @invoiceTable TABLE (
Id INT NOT NULL,
CustName NVARCHAR(MAX) NOT NULL,
FilteredRecords INT DEFAULT 0 NOT NULL
)

Insert into @invoiceTable(
Id,
CustName,
FilteredRecords -- ****Here I need help****
)
Select 
I.Id,
R.Name,
(Select Count(Id) from @invoiceTable)
from Invoice I Inner Join Customer R on I.CustomerId = R.Id
UPDATE @invoiceTable SET CustName= 'Anonymous' WHERE CustName Like'%-%'
Select * from @invoiceTable
where Id In (1,4)
现在我得到了以下明显的结果

Id       CustName   FilteredCount  
-------- ---------- ----------------
1        John       0
4        Anonymous  0
但我想要的不是FilteredCount列中@invoiceTable的总行数

预期的结果是

Id       CustName   FilteredCount  
-------- ---------- ----------------
1        John       2
4        Anonymous  2
因为@invoiceTable中只有两行,所以FilteredCount列中需要2行


是否有任何方法可以实现此目的,请帮助我。

如果您只对Id 1和4感兴趣,可以在INSERT查询中对其进行筛选

至于匿名者,你可以用case语句来做这件事

窗口函数count*over将提供查询结果中的总行数

Insert into @invoiceTable ( Id, CustName, FilteredRecords )
Select  Id = I.Id,
        CustName = CASE WHEN R.Name Like '%-%' then 'Anonymous' else R.Name end,
        FilteredRecords = count(*) over()
from   Invoice I 
       Inner Join Customer R on I.CustomerId = R.Id
where  I.Id In (1,4)

如果您只对Id 1和4感兴趣,可以在INSERT查询中对其进行筛选

至于匿名者,你可以用case语句来做这件事

窗口函数count*over将提供查询结果中的总行数

Insert into @invoiceTable ( Id, CustName, FilteredRecords )
Select  Id = I.Id,
        CustName = CASE WHEN R.Name Like '%-%' then 'Anonymous' else R.Name end,
        FilteredRecords = count(*) over()
from   Invoice I 
       Inner Join Customer R on I.CustomerId = R.Id
where  I.Id In (1,4)

现在还不清楚你是想要整张桌子的计数,还是只想要最后的选择,我选择了后者

实际上,这里根本不需要临时桌子:

选择 一、身份证, Name=当CustName(如“%-%”然后是“匿名”或R.Name结束时的大小写, FilteredRecords=计数*结束 从发票一 在I.CustomerId=R.Id上内部加入客户R 其中Id在1,4中;
现在还不清楚你是想要整张桌子的计数,还是只想要最后的选择,我选择了后者

实际上,这里根本不需要临时桌子:

选择 一、身份证, Name=当CustName(如“%-%”然后是“匿名”或R.Name结束时的大小写, FilteredRecords=计数*结束 从发票一 在I.CustomerId=R.Id上内部加入客户R 其中Id在1,4中;
FilteredCount的逻辑是什么?您只对Id=1或4进行计数?@Squirrel是的,我希望在执行where语句后进行计数,因此在本例中是的,我得到两条记录,因此计数应为2。FilteredCount的逻辑是什么?您只对Id=1或4进行计数?@Squirrel是的,我希望在执行where语句后进行计数,所以在本例中是的,我得到两条记录,所以计数应该是两条。在这个解决方案中,我得到了8条作为FilteredRecords,但结果显示了两条记录,所以FilteredRecords应该是2,有什么办法吗?你有没有加入WHERE子句?是的,按照你的建议用I.Id更新了Id,效果很好,谢谢。我有没有办法在Id上应用WHERE子句而不是I.Id?有什么不同?I.Id是Id在这个解决方案中也是一样,我得到了8个作为FilteredRecords,但结果显示了两个记录,所以FilteredRecords应该是2,有没有办法?你是否包括了WHERE子句?是的,按照你的建议用I.Id更新了Id,它起了作用,谢谢。有没有办法我可以在Id上应用WHERE子句而不是I.Id?有什么不同?I.Id是Id这是sameI想要的唯一最终选择计数。这就是你得到的!是的,谢谢你的帮助。我只想数最后的选择。这就是你得到的!是的,谢谢你的帮助。