SQL Server 子查询返回了超过 1 个值(请帮助我)

本文关键字:个值 帮助 Server 查询 返回 SQL | 更新日期: 2023-09-27 17:55:31

我在下面给出的代码可以帮助我为什么它显示这种类型的错误" SQL Server Subquery返回了超过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

SQL Server 子查询返回了超过 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 )

您的查询

select ClientId from [dbo].[tblClientContactDetails])<>@ClientId

因为@ClientId可以保存一个查询,而select ClientId from [dbo].[tblClientContactDetails])返回多个记录,因此 Sql 服务器引擎与我应该比较 @ClientId 值的结果集的哪个值混淆,并最终导致错误。

修改查询,使其仅返回一条记录,您就完成了。

您使用

的查询返回了多个值。可能在您的查询中,您只期望一个值。但它返回了多个值。在您的情况下,我认为有多个具有相同客户端 ID 的记录或查询是错误的

这里的问题出在这一行:

If((select ClientId from [dbo].[tblClientContactDetails])<>@ClientId or (select ClientId from [dbo].[tblClientContactDetails]) is null )

此条件需要一个返回值,在您的情况下,它返回多个值,因此 SQL Server 无法处理此值。

更改查询的方式是,它根据查询中的条件返回单个值,您将完成。

希望这有帮助。

更改行

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
)

将查询更新为:

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

请让我知道,这对你有用吗?