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

时间:2015-06-12 09:24:27

标签: c# sql

我在下面给出的代码可以帮助我解释为什么它显示这种类型的错误“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

6 个答案:

答案 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

请告诉我,这对你有用吗?