Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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 为什么此insert语句不能在其中插入值';第二次迭代?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 为什么此insert语句不能在其中插入值';第二次迭代?

Sql 为什么此insert语句不能在其中插入值';第二次迭代?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个大小合理的存储过程,它接受3个集合,两个UDTT集合和一个CSV集合 我已将以下值传递给测试存储过程。然而,问题出现在一个名为empsignations的小主表中,该表有5列。我在存储过程中使用了一个循环将值插入EmpDesignations。循环是必需的,因为值是从CSV字符串中提取的。正如预期的那样,它确实使用两组值迭代了2次。第一次迭代成功插入数据,但在第二次迭代中未插入数据。我已经检查了数据是否为空,但是那些变量@tmpEmpID和@tmp包含数据。所以我无法解决问题 emp名称

我有一个大小合理的
存储过程
,它接受3个集合,两个
UDTT
集合和一个
CSV
集合

我已将以下值传递给测试
存储过程
。然而,问题出现在一个名为
empsignations
的小主表中,该表有5列。我在
存储过程中使用了一个循环
将值插入
EmpDesignations
。循环是必需的,因为值是从
CSV字符串中提取的。正如预期的那样,它确实使用两组值迭代了2次。第一次迭代成功插入数据,但在第二次迭代中未插入数据。我已经检查了数据是否为空,但是那些变量
@tmpEmpID
@tmp
包含数据。所以我无法解决问题

emp名称
表定义为

EmpID PK, FK not null
DesigID PK, FK not null
IsValid int not null
UpdtDT datetime not null containts to getDate()
AuthID int not null  EmpID
下面是表列和类型的快照

在第一次迭代中,将值传递给insert语句显示在监视窗口中

如您所见,
@@rowcount
1所以在第一轮中工作得很好!

在下面的监视中,显示了向insert语句传递值,这是在第二次迭代中:

但是
@@rowcount
不是
1
,因此控件
回滚所有插入

这里是一个视频链接

这是我的视频

表定义是正确的,传递的值的数量与输入列的数量相匹配,并且变量在两次迭代中都用值填充,那么会出现什么问题

下面是SQL server为表指定生成的脚本

    USE [SMSV100]
GO

/****** Object:  Table [dbo].[EmpDesignations]    Script Date: 04/12/2014 08:50:23 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[EmpDesignations](
    [EmpID] [int] NOT NULL,
    [DesigID] [int] NOT NULL,
    [IsValid] [int] NOT NULL,
    [UpdtDT] [datetime] NOT NULL,
    [AuthID] [int] NOT NULL,
 CONSTRAINT [PK_EmpDesignations] PRIMARY KEY CLUSTERED 
(
    [EmpID] ASC,
    [DesigID] 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

ALTER TABLE [dbo].[EmpDesignations]  WITH CHECK ADD  CONSTRAINT [FK_EmpDesignations_Designations] FOREIGN KEY([DesigID])
REFERENCES [dbo].[Designations] ([DesigID])
GO

ALTER TABLE [dbo].[EmpDesignations] CHECK CONSTRAINT [FK_EmpDesignations_Designations]
GO

ALTER TABLE [dbo].[EmpDesignations]  WITH CHECK ADD  CONSTRAINT [FK_EmpDesignations_Employees] FOREIGN KEY([EmpID])
REFERENCES [dbo].[Employees] ([EmpID])
GO

ALTER TABLE [dbo].[EmpDesignations] CHECK CONSTRAINT [FK_EmpDesignations_Employees]
GO

ALTER TABLE [dbo].[EmpDesignations] ADD  CONSTRAINT [DF_EmpDesignations_UpdtDT]  DEFAULT (getdate()) FOR [UpdtDT]
GO

谢谢

您如何知道@ROWCOUNT在第二次迭代中不是1?您是否在第二次迭代中保存了该变量的状态并将其打印出来(在上面的代码中看不到)。当sql在“insert”的正上方执行“select”语句时。@@rowcount包含值1,但在执行“insert”后,它立即变为0,这意味着插入失败,对吗?我会用这些值手动创建两个insert语句,看看这是否能说明发生了什么。@phil,我会这样做的,我会让你知道:)@phil,我已经将insert语句的一个重复insert语句添加到EMP中,在执行第一个insert语句时@@rowcount有1,在执行重复的insert语句后@@rowcount有0,因此这次第一次迭代失败