Проблема выбора запроса для номера 2? - PullRequest
0 голосов
/ 23 июля 2010

Я просто создаю эту хранимую процедуру при выборе palletnumber = datatype is int. SerialNumber - это varchar. Тогда номера паллет составляют 1 - 200 ... Но если я введу 2, это показывает 2 с другими номерами паллет. Я изменяю @search на nchar и все в порядке, но серийный номер имеет ошибку. Я новичок в хранимой процедуре.

ALTER PROCEDURE [dbo].[sp_SearchFresh]
    -- Add the parameters for the stored procedure here
    @Search varchar(50)--so that i only have one search engine/input box
AS
SELECt  dbo.Monitor.SerialNumber, 
      WIP.dbo.WIPTEST.PartNumber,
      dbo.Monitor.PalletNumber
FROM  WIP.dbo.WIPTEST 
      INNER JOIN dbo.Monitor 
         ON WIP.dbo.WIPTEST.SerialNumber = dbo.Monitor.SerialNumber
WHERE WIP.dbo.WIPTEST.StatusDescription = 'FG-FRESH' 
    AND (dbo.Monitor.PalletNumber = @Search 
        OR dbo.Monitor.SerialNumber LIKE @Search + '%' )
END

это работает .. я буду практиковать динамический SQL. Но как я могу предоставить нулевые значения на моем интерфейсе? это мой код DAL

public DataSet FGSearch_Grid (пользователь Ientity) {

        SqlConnection conn = new SqlConnection(connStr);
        SqlCommand cmd = new SqlCommand("sp_SearchFresh", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        DataSet dSet = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        cmd.Parameters.Add("@Search", SqlDbType.VarChar, 50).Value = user.Search;

        try
        {
            conn.Open();

            da.Fill(dSet, "WIPDATA");

            conn.Close();
        }
        catch (SqlException)
        {
            throw;
        }
        return dSet;
    }

Ответы [ 4 ]

2 голосов
/ 23 июля 2010

Вы быстро обнаруживаете, что использование одного параметра неэффективно для обслуживания нескольких критериев фильтрации с разными типами данных.Облегчите себе задачу и примите, что для каждого отдельного критерия фильтрации, который вы хотите предоставить, должен быть отдельный параметр аргумента хранимой процедуры.

1 голос
/ 23 июля 2010

Чтобы @Search и номер паллета оценивались как int try

AND (dbo.Monitor.PalletNumber = cast(@Search as int)
0 голосов
/ 23 июля 2010

Будьте осторожны с «Catch All Queries», так как они всегда вызывают полное сканирование таблицы. Если вы их не знаете, загляните в блог Гейл Шон Catch All Queries .

Единственный способ обеспечить использование индекса с необязательными аргументами - это динамический SQL (используйте sp_executesql, чтобы избежать внедрения SQL):

ALTER PROCEDURE [dbo].[sp_SearchFresh]    
  @search varchar(50),
  @pallet_num INT
AS

DECLARE @sql NVARCHAR(4000);

SET @sql = N'
  SELECT dbo.Monitor.SerialNumber,      
              WIP.dbo.WIPTEST.PartNumber,      
              dbo.Monitor.PalletNumber
    FROM  WIP.dbo.WIPTEST       
      JOIN dbo.Monitor ON WIP.dbo.WIPTEST.SerialNumber = dbo.Monitor.SerialNumber
  WHERE WIP.dbo.WIPTEST.StatusDescription = ''FG-FRESH'''

IF (@search IS NOT NULL)
BEGIN
   SET @sql = @sql + ' AND dbo.Monitor.SerialNumber LIKE @searchIN';
   SET @search = REPLACE(@search, '%', '%%') + '%';
END

IF (@pallet_num IS NOT NULL)
   SET @sql = @sql + ' AND dbo.Monitor.PalletNumber = @pallet_numIN';

EXECUTE sp_executesql 
            @sql
            ,N'@searchIN VARCHAR(50), @pallet_numIN INT'
            ,@searchIN = @search
            ,@pallet_numIN = @pallet_num;
0 голосов
/ 23 июля 2010

Убедитесь, что номера паллет, которые вы получаете, не имеют серийного номера, начинающегося с 2?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...