Хранимая процедура поиска следующей и предыдущей строки в SQL Server 2005 - PullRequest
1 голос
/ 04 сентября 2011

Сейчас у меня есть этот код для поиска следующей и предыдущей строк с использованием SQL Server 2005. intID - это номер идентификатора галереи с использованием типа данных bigint:

SQL = "SELECT TOP 1 max(p.galleryID) as previousrec, min(n.galleryID) AS nextrec FROM gallery AS p CROSS JOIN gallery AS n where p.galleryid < '"&intID&"' and n.galleryid > '"&intID&"'"
Set rsRec = Server.CreateObject("ADODB.Recordset")
rsRec.Open sql, Conn
strNext = rsRec("nextrec")
strPrevious = rsRec("previousrec")
rsRec.close
set rsRec = nothing

Задача № 1:

Самая новая строка вернет нули в следующей записи, потому что ее нет. Самая старая строка будет возвращать нули, потому что нет «предыдущей записи». Так что, если «следующая запись» или «предыдущая запись» не существует, она возвращает нули для обоих.

Задача № 2:

Я хочу создать хранимую процедуру для вызова из БД, чтобы в нее можно было просто передать intid

ТИА

Ответы [ 3 ]

1 голос
/ 05 сентября 2011

Это даст NULL для предыдущего в первом ряду и NULL для следующего в последнем.Хотя ваш порядок кажется мне задом наперед;почему «следующий» ниже, чем «предыдущий»?

CREATE PROCEDURE dbo.GetGalleryBookends
    @GalleryID INT
AS
BEGIN
    SET NOCOUNT ON;

    ;WITH n AS 
    (
        SELECT galleryID, rn = ROW_NUMBER() 
          OVER (ORDER BY galleryID) 
          FROM dbo.gallery
    )
    SELECT
      previousrec = MAX(nA.galleryID), 
      nextrec     = MIN(nB.galleryID)
    FROM n 
    LEFT OUTER JOIN n AS nA
    ON nA.rn = n.rn - 1
    LEFT OUTER JOIN n AS nB
    ON nB.rn = n.rn + 1
    WHERE n.galleryID = @galleryID;
END
GO

Также не имеет смысла хотеть пустую строку вместо NULL.Ваш ASP-код может нормально работать со значениями NULL, иначе вам придется каждый раз преобразовывать полученные целые числа в строки.Если вы действительно этого хотите, вы можете сказать:

      previousrec = COALESCE(CONVERT(VARCHAR(12), MIN(nA.galleryID)), ''), 
      nextrec     = COALESCE(CONVERT(VARCHAR(12), MAX(nB.galleryID)), '')

Но это больше не будет работать хорошо при переходе от ASP к ASP.NET, потому что типы гораздо более явные.Гораздо лучше иметь код приложения, с которым можно справиться, вместо того, чтобы бояться значений NULL.

Это похоже на большую работу, чтобы получить предыдущий и следующий идентификатор, не извлекая никакой информациио текущем ID.Вы реализуете пейджинг?Если это так, я настоятельно рекомендую прочитать эту статью и этот последующий разговор .

0 голосов
/ 04 сентября 2011

Поскольку Хоган внес вклад с помощью оператора SQL, позвольте мне внести вклад с сохраненной частью процедуры:

CREATE PROCEDURE spGetNextAndPreviousRecords 
    -- Add the parameters for the stored procedure here
    @intID int 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT TOP 1 max(p.galleryID) as previousrec, min(n.galleryID) AS nextrec 
       FROM gallery AS p 
       CROSS JOIN gallery AS n 
              where (p.galleryid < @intID or p.galleryid is null)
              and (n.galleryid > @intID  or n.galleryid is null)

END

И вы вызываете это из кода следующим образом (при условии VB.NET):

 Using c As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
       c.Open()
       Dim command = New SqlCommand("spGetNextAndPreviousRecords")

       command.Parameters.AddWithValue("@intID", yourID)
       Dim reader as SqlDataReader = command.ExecuteReader()
       While(reader.Read())
          ' read the result here
       End While
End Using
0 голосов
/ 04 сентября 2011

Попробуйте (не проверено)

SELECT TOP 1 max(p.galleryID) as previousrec, min(n.galleryID) AS nextrec 
       FROM gallery AS p 
       CROSS JOIN gallery AS n 
              where (p.galleryid < @intID or p.galleryid is null)
              and (n.galleryid > @intID  or n.galleryid is null)

Я предполагаю, что вы проверяете, что intID является целым числом перед использованием этого кода.

Что касается хранимой процедуры - вы спрашиваете, как написать хранимую процедуру? Если так, есть много обучающих программ, которые очень хороши в сети.

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