我在下面给出的代码可以帮助我解释为什么它显示这种类型的错误“SQL Server子查询返回的值超过1。当子查询跟随=,!=,<,<时,这是不允许的。 =,>,> =“
create procedure [dbo].[ManageClientContacts]
(
@ClientId int,
@FirstName nvarchar(255)=null,
@LastName nvarchar(255)=null,
@City nvarchar(255)=null,
@State nvarchar(255)=null,
@Country nvarchar(255)=null,
@PostalCode nvarchar(255)=null,
@ContactName nvarchar(255)=null,
@ContactNumber nvarchar(255)=null,
@Email nvarchar(255)=null,
@ContactEmail nvarchar(255)=null
)
as
begin
If((select ClientId from [dbo].[tblClientContactDetails])<>@ClientId or (select ClientId from [dbo].[tblClientContactDetails]) is null )
begin
Insert into [dbo].[tblClientContactDetails]
(
ClientId ,FirstName ,LastName,City ,State ,Country ,PostalCode ,ContactName ,ContactNumber ,Email,ContactEmail,InsertedDate)
values (
@ClientId ,@FirstName ,@LastName,@City ,@State ,@Country ,@PostalCode ,@ContactName ,@ContactNumber ,@Email,@ContactEmail,getdate())
end
else
begin
Update [dbo].[tblClientContactDetails] set
ClientId=@ClientId
,FirstName=@FirstName
,LastName=@LastName
,City=@City
,[State]=@State
,Country=@Country
,PostalCode=@PostalCode
,ContactName=@ContactName
,ContactNumber=@ContactNumber
,Email=@Email
,ContactEmail=@ContactEmail
,UpdatedDate=getdate()
where ClientId=@ClientId
end
end
RETURN 0
答案 0 :(得分:1)
错误是自我解释的,您的子查询返回多个记录,其中预期返回单个值。
查看您的查询
select ClientId from [dbo].[tblClientContactDetails]
这将返回您表中存储的所有clientId
,这可能是您不想要的,因此请更改您的查询
select ClientId from [dbo].[tblClientContactDetails] where ClientId = @ClientId
因此您的if
条件将
If((select ClientId from [dbo].[tblClientContactDetails] where ClientId = @ClientId)<>@ClientId or (select ClientId from [dbo].[tblClientContactDetails] where ClientId = @ClientId) is null )
答案 1 :(得分:1)
您的查询
select ClientId from [dbo].[tblClientContactDetails])<>@ClientId
导致此问题。因为@ClientId
可以保留一个查询而select ClientId from [dbo].[tblClientContactDetails])
返回多个记录,所以Sql server引擎与结果集的哪个值混淆我应该比较@ClientId
的值并最终导致错误。
修改您的查询,使其只返回一条记录,然后就完成了。
答案 2 :(得分:0)
您使用的查询返回了多个值。 可能在您的查询中您只期望一个值。但它返回了不止一个值。 在你的情况下,我认为有多个记录具有相同的客户端ID或查询是错误的
答案 3 :(得分:0)
问题出在这一行:
If((select ClientId from [dbo].[tblClientContactDetails])<>@ClientId or (select ClientId from [dbo].[tblClientContactDetails]) is null )
此条件需要一个单一的返回值,在您的情况下,它返回多个值,因此SQL Server无法处理。
更改您的查询,使其根据查询中的条件返回单个值,您就可以完成了。
希望这有帮助。
答案 4 :(得分:0)
更改行
If((select ClientId from [dbo].[tblClientContactDetails])<>@ClientId or (select ClientId from [dbo].[tblClientContactDetails]) is null )
到此
If not exists
(
select * from [dbo].[tblClientContactDetails] where ClientId = @ClientId
)
答案 5 :(得分:0)
将您的查询更新为:
CREATE PROCEDURE [dbo].[ManageClientContacts]
(
@ClientId int,
@FirstName nvarchar(255)=null,
@LastName nvarchar(255)=null,
@City nvarchar(255)=null,
@State nvarchar(255)=null,
@Country nvarchar(255)=null,
@PostalCode nvarchar(255)=null,
@ContactName nvarchar(255)=null,
@ContactNumber nvarchar(255)=null,
@Email nvarchar(255)=null,
@ContactEmail nvarchar(255)=null
)
AS
BEGIN
IF NOT EXISTS( SELECT ClientId FROM [dbo].[tblClientContactDetails] WHERE ClientID = @ClientId)
--This checks if record is not present for given client id then insert new record
BEGIN
--Here in Insert statement pass ClientID only if you dont set ClientID as Primary key with auto-increment
INSERT INTO [dbo].[tblClientContactDetails]
(
ClientId ,FirstName ,LastName,City ,State ,Country ,PostalCode ,ContactName ,ContactNumber ,Email,ContactEmail,InsertedDate)
VALUES (
@ClientId ,@FirstName ,@LastName,@City ,@State ,@Country ,@PostalCode ,@ContactName ,@ContactNumber ,@Email,@ContactEmail,getdate()
)
END
ELSE
BEGIN
UPDATE [dbo].[tblClientContactDetails]
SET
FirstName=@FirstName
,LastName=@LastName
,City=@City
,[State]=@State
,Country=@Country
,PostalCode=@PostalCode
,ContactName=@ContactName
,ContactNumber=@ContactNumber
,Email=@Email
,ContactEmail=@ContactEmail
,UpdatedDate=getdate()
WHERE ClientId=@ClientId
END
END
请告诉我,这对你有用吗?