C# 插入,更新错误:子查询在C中返回了超过1行#

C# 插入,更新错误:子查询在C中返回了超过1行#,c#,sql,sql-server,stored-procedures,C#,Sql,Sql Server,Stored Procedures,我已经用C#在存储过程和查询中编写了一个SQL脚本 但它抛出了一个错误: 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时 据我所知,问题在于子查询向主查询返回了多行。我可以知道怎么解决吗?多谢各位 public void insertData(string TransID, string Item, string FromLocation, string Qty, string Requestor, string RefNum, string Remark, string R

我已经用C#在存储过程和查询中编写了一个SQL脚本

但它抛出了一个错误:

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时

据我所知,问题在于子查询向主查询返回了多行。我可以知道怎么解决吗?多谢各位

public void insertData(string TransID, string Item, string FromLocation, string Qty, string Requestor, string RefNum, string Remark, string ReasonID, string ReasonRemark, string CreateDate, string CreateUser, string ToLocation)
{
    string constr = ConfigurationManager.ConnectionStrings["CIMProRPT01ConnectionString"].ConnectionString;

    using (SqlConnection _cn = new SqlConnection(constr))
    {
        using (SqlCommand _cmd = new SqlCommand("MMSIssue_InsertOrUpdate", _cn))
        {
            using (SqlDataAdapter da = new SqlDataAdapter(_cmd))
            {
                _cn.Open();

                _cmd.CommandType = CommandType.StoredProcedure;

                _cmd.Parameters.AddWithValue("@INV_TRANS_ID", TransID);
                _cmd.Parameters.AddWithValue("@INV_ID", Item);
                _cmd.Parameters.AddWithValue("@INV_LOCATION", FromLocation);
                _cmd.Parameters.AddWithValue("@INV_QTY", Qty);
                _cmd.Parameters.AddWithValue("@INV_TRANS_REQUESTOR", Requestor);
                _cmd.Parameters.AddWithValue("@INV_TRANS_REFNO", RefNum);
                _cmd.Parameters.AddWithValue("@INV_TRANS_REMARK", Remark);
                _cmd.Parameters.AddWithValue("@INV_REASON_ID", ReasonID);
                _cmd.Parameters.AddWithValue("@INV_REASON_REMARK", ReasonRemark);
                _cmd.Parameters.AddWithValue("@INV_CREATE_DATE", CreateDate);
                _cmd.Parameters.AddWithValue("@INV_CREATE_USER", CreateUser);
                _cmd.Parameters.AddWithValue("@INV_FROMLOC", ToLocation);

                _cmd.Parameters.Add("@RecordFound", SqlDbType.Int, 0);
                _cmd.Parameters["@RecordFound"].Direction = ParameterDirection.Output;

                _cmd.ExecuteNonQuery();

                string DeleteWMMRSQL = "DELETE FROM [CIMProRPT01].[dbo].[OTH_INV_QTY_LOC] WHERE INV_QTY = 0 OR INV_QTY is null OR INV_QTY <= '-1'";

                SqlCommand cmd3 = new SqlCommand(DeleteWMMRSQL, _cn);
                cmd3.ExecuteNonQuery();

                _cn.Close();

                float INV_QTY = Convert.ToInt32(_cmd.Parameters["@RecordFound"].Value.ToString());

                if (INV_QTY == 2)
                {
                    //QTY is more Than existing QTY !!"); 
                    Response.Write("QTY is more Than existing QTY !!");
                    Response.Redirect("MMS_LocationTrans.aspx");
                }
                else
                {
                    //QTY not able to key in 0
                    Response.Write("QTY not able to key in 0!!");
                }
            }
        }
    }
}

存储过程中的这一行存在问题:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[MMSIssue_InsertOrUpdate] 
    @INV_TRANS_ID VARCHAR(40),
    @INV_ID VARCHAR(40),
    @INV_LOCATION VARCHAR(40),
    @INV_QTY FLOAT,
    @INV_TRANS_REQUESTOR VARCHAR(40),
    @INV_TRANS_REFNO VARCHAR(40),
    @INV_TRANS_REMARK VARCHAR(255),
    @INV_REASON_ID VARCHAR(40),
    @INV_REASON_REMARK VARCHAR(255),
    @INV_CREATE_DATE DATETIME,
    @INV_CREATE_USER VARCHAR (255),
    @INV_FROMLOC VARCHAR (40),
    @RecordFound INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    IF EXISTS(SELECT * FROM OTH_INV_QTY_LOC 
              WHERE INV_ID = @INV_ID AND INV_LOCATION = @INV_LOCATION)
    BEGIN
        UPDATE OTH_INV_QTY_LOC 
        SET [INV_ID] = @INV_ID,
            INV_LOCATION = @INV_LOCATION, 
            INV_QTY = INV_QTY - @INV_QTY 
        WHERE INV_ID = @INV_ID 
          AND INV_LOCATION = @INV_LOCATION

        INSERT INTO OTH_INV_TRANSACTION (INV_TRANS_ID, INV_ID, INV_TRANS_LOCATION, INV_TRANS_QTY, INV_TRANS_REQUESTOR, INV_TRANS_REFNO, INV_TRANS_REMARK, INV_REASON_ID, INV_REASON_REMARK, INV_CREATE_DATE, INV_CREATE_USER, INV_FROMLOC)
        VALUES (@INV_TRANS_ID, @INV_ID, @INV_LOCATION, @INV_QTY, @INV_TRANS_REQUESTOR, @INV_TRANS_REFNO, @INV_TRANS_REMARK, @INV_REASON_ID, @INV_REASON_REMARK, @INV_CREATE_DATE, @INV_CREATE_USER, @INV_FROMLOC)

        DECLARE @InvFindQTY FLOAT 
        SET @InvFindQTY = (SELECT INV_QTY FROM OTH_INV_QTY_LOC)

        IF @InvFindQTY >= @INV_QTY 
        BEGIN
            SELECT @RecordFound = 2
        END
        ELSE
        BEGIN
            SELECT @RecordFound = 1
        END
    END
    ELSE 
    BEGIN
        SELECT @RecordFound = 0
    END
END
DECLARE  @InvFindQTY FLOAT 
SET @InvFindQTY = ( SELECT INV_QTY FROM OTH_INV_QTY_LOC)
如果您在其他库存数量LOC中有多条记录,您将收到此错误

看起来您应该能够通过添加

WHERE INV_ID = @INV_ID
确保只选择一条记录,即:

SET @InvFindQTY = ( SELECT INV_QTY FROM OTH_INV_QTY_LOC WHERE INV_ID = @INV_ID)

因为您没有提供存储过程,所以我无法确定您的问题到底是什么。如果您认为子查询向主查询返回了多个结果,您可以尝试使用
选择top 1
来限制子查询返回的结果,以查看这是否确实是子查询本身的问题,并查看结果。决定你想要哪一个。写代码来获得它。非常非常感谢兄弟。我已经搜索了大部分帖子,但没有解决。