Mahesh2223 Ответов: 1

Sql server вложенный, если еще проблема..


Я пытаюсь отфильтровать gridview на основе элементов, выбранных в выпадающем списке .
у меня есть некоторые ошибки в cs, например, добавление параметров в процедуру и в моем sql-сервере у меня есть некоторые проблемы с запросом. его возвращение больше строк. он добавляет все строки и которые когда-либо выбираются в выпадающем списке, я думаю, что мой запрос неверен.. например, всего у меня 109 записей. и если я выберу назначено в выпадающем списке есть как 24. так что всего 24 и 109 добавляются и 133 возвращается.


пожалуйста, помогите мне с запросом ??

и проблема при добавлении параметров в cmd.

Что я уже пробовал:

Моя процедура..
alter procedure Sp_SelectedStatus 'Assigned'
@Status varchar(20)
as 
Begin
      
    IF (@Status = 'Active')
    BEGIN
        SELECT A.GroupName, 
               B.Brand, 
               B.Model, 
               B.SerialNo, 
               B.Status,
               B.AddedOn 
        FROM   GroupDetails AS A
        INNER JOIN DeviceDetails AS B ON A.GroupId = B.GroupId 
        WHERE  Status = 'Active'
    END

    IF (@Status = 'Assigned')
    BEGIN
        SELECT A.GroupName, 
               B.Brand, 
               B.Model, 
               B.SerialNo,
               B.Status,
               B.AddedOn 
        FROM   GroupDetails AS A
        INNER JOIN DeviceDetails AS B ON A.GroupId = B.GroupId 
        WHERE  Status = 'Assigned'
    END

    IF (@Status = 'Returned')
    BEGIN
        SELECT A.GroupName, 
               B.Brand, 
               B.Model, 
               B.SerialNo, 
               B.Status,
               B.AddedOn 
        FROM  GroupDetails AS A
        INNER JOIN DeviceDetails AS B ON A.GroupId = B.GroupId 
        WHERE Status = 'Returned'
    END
    if (@Status = 'De-activated')
    Begin
        Select A.GroupName, 
               B.Brand , 
               B.Model , 
               B.SerialNo , 
               B.Status ,
               B.AddedOn 
        from GroupDetails as A
        inner join DeviceDetails as B on A.GroupId = B.GroupId 
        where Status = 'De-activated'
    End 

    if(@Status = 'Sent for repair')
    Begin
        Select A.GroupName , 
               B.Brand , 
               B.Model , 
               B.SerialNo , 
               B.Status ,
               B.AddedOn 
        from GroupDetails as A
        inner join DeviceDetails as B on A.GroupId = B.GroupId 
        where Status = 'Sent for repair'
    End
    else 
    Begin
        Select A.GroupName , 
               B.Brand , 
               B.Model , 
               B.SerialNo , 
               B.Status ,
               B.AddedOn 
        from GroupDetails as A
        inner join DeviceDetails as B on A.GroupId = B.GroupId
    End
End     


мое событие изменения индекса

protected void ddlState_SelectedIndexChanged(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection(cs);
    SqlCommand cmd = new SqlCommand("Sp_SelectedStatus", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@Status", SqlDbType.NVarChar).Value = "Status";
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();

    try
    {
        con.Open();
        da.Fill(ds);
        grdDeviceDetails.DataSource = ds;
        grdDeviceDetails.DataBind();
        con.Close();
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
    }
}

ZurdoDev

Вы же не хотите писать свой sql таким образом.
Вместо этого что-то вроде
ВЫБИРАТЬ *
Из табл. 1 Т1
Внутреннее соединение table2 t2 на t1. GroupID = t2.GroupID
Где T1.Статус = @статус или @статус = "

Тогда у вас есть одно-единственное утверждение.

1 Ответов

Рейтинг:
4

#realJSOP

Я дал тебе ответ примерно день назад.

Это не правильный способ написания этого sql-запроса. Вы должны сделать это таким образом:

Select A.GroupName , 
       B.Brand , 
       B.Model , 
       B.SerialNo , 
       B.Status ,
       B.AddedOn 
FROM GroupDetails AS A
INNER JOIN DeviceDetails AS B ON A.GroupId = B.GroupId 
WHERE B.Status LIKE @status OR @status = ''


Кроме того, если бы это был я, я бы дал параметру @Status значение по умолчанию ". Таким образом, я мог бы вызвать proc без каких-либо параметров и все равно получить записи обратно.
Это вернет все записи, соответствующие текущему значению @status, или если @status является пустой строкой, возвращает все записи. Кроме того, вы, вероятно, должны использовать LIKE вместо " = " в WHERE оговорка, потому что вы не можете гарантировать, что случай будет совпадать.