In LISTING 2, I have a SPROC that returns a recordset and a recordcount in
SQL QA. I can access the Recordset with no problem. How can I grab the
Recordcount with ASP code at the same time I'm getting the Recordset? In QA,
the RecordCount displays below the Recordset.
The below USAGE code will display my SPROC results.
USAGE:
EXEC SELECT_WITH_PAG ING 'CustomerID, ShipName', 'OrderID',
'Northwind.dbo. Orders', 3, 10, 1, '', 'OrderDate' *************** *********
LISTING 1: ASP CODE
Set objConn = CreateObject("A DODB.Connection ")
objConn.Open myDSN
Set objRS = Server.CreateOb ject("ADODB.Rec ordset")
strSQL = "SELECT_WITH_PA GING " & SParms
objRS.Open strSQL, objConn
*************** *********
LISTING 2: SPROC
CREATE PROCEDURE SELECT_WITH_PAG ING (
@strFields VARCHAR(4000) ,
@strPK VARCHAR(100),
@strTables VARCHAR(4000),
@intPageNo INT = 1,
@intPageSize INT = NULL,
@blnGetRecordCo unt BIT = 0,
@strFilter VARCHAR(8000) = NULL,
@strSort VARCHAR(8000) = NULL,
@strGroup VARCHAR(8000) = NULL
)
AS
DECLARE @blnBringAllRec ords BIT
DECLARE @strPageNo VARCHAR(50)
DECLARE @strPageSize VARCHAR(50)
DECLARE @strSkippedRows VARCHAR(50)
DECLARE @strFilterCrite ria VARCHAR(8000)
DECLARE @strSimpleFilte r VARCHAR(8000)
DECLARE @strSortCriteri a VARCHAR(8000)
DECLARE @strGroupCriter ia VARCHAR(8000)
DECLARE @intRecordcount INT
DECLARE @intPagecount INT
--******** NORMALIZE THE PAGING CRITERIA
--if no meaningful inputs are provided, we can avoid paging and execute a
more efficient query, so we will set a flag that will help with that
(blnBringAllRec ords)
IF @intPageNo < 1
SET @intPageNo = 1
SET @strPageNo = CONVERT(VARCHAR (50), @intPageNo)
IF @intPageSize IS NULL OR @intPageSize < 1 -- BRING ALL RECORDS, DON'T DO
PAGING
SET @blnBringAllRec ords = 1
ELSE
BEGIN
SET @blnBringAllRec ords = 0
SET @strPageSize = CONVERT(VARCHAR (50), @intPageSize)
SET @strPageNo = CONVERT(VARCHAR (50), @intPageNo)
SET @strSkippedRows = CONVERT(VARCHAR (50), @intPageSize * (@intPageNo -
1))
END
--******** NORMALIZE THE FILTER AND SORTING CRITERIA
--if they are empty, we will avoid filtering and sorting, respectively,
executing more efficient queries
IF @strFilter IS NOT NULL AND @strFilter != ''
BEGIN
SET @strFilterCrite ria = ' WHERE ' + @strFilter + ' '
SET @strSimpleFilte r = ' AND ' + @strFilter + ' '
END
ELSE
BEGIN
SET @strSimpleFilte r = ''
SET @strFilterCrite ria = ''
END
IF @strSort IS NOT NULL AND @strSort != ''
SET @strSortCriteri a = ' ORDER BY ' + @strSort + ' '
ELSE
SET @strSortCriteri a = ''
IF @strGroup IS NOT NULL AND @strGroup != ''
SET @strGroupCriter ia = ' GROUP BY ' + @strGroup + ' '
ELSE
SET @strGroupCriter ia = ''
--*************** *********** NOW START DOING THE REAL WORK
--!NOTE: for potentially improved performance, use sp_executesql instead of
EXEC
IF @blnBringAllRec ords = 1 --ignore paging and run a simple select
BEGIN
EXEC (
'SELECT ' + @strFields + ' FROM ' + @strTables + @strFilterCrite ria +
@strGroupCriter ia + @strSortCriteri a
)
END-- WE HAD TO BRING ALL RECORDS
ELSE --BRING ONLY A PARTICULAR PAGE
BEGIN
IF @intPageNo = 1 --in this case we can execute a more efficient query,
with no subqueries
EXEC (
'SELECT TOP ' + @strPageSize + ' ' + @strFields + ' FROM ' + @strTables +
@strFilterCrite ria + @strGroupCriter ia + @strSortCriteri a
)
ELSE --execute a structure of subqueries that brings the correct page
EXEC (
'SELECT ' + @strFields + ' FROM ' + @strTables + ' WHERE ' + @strPK + '
IN ' + '
(SELECT TOP ' + @strPageSize + ' ' + @strPK + ' FROM ' + @strTables +
' WHERE ' + @strPK + ' NOT IN ' + '
(SELECT TOP ' + @strSkippedRows + ' ' + @strPK + ' FROM ' + @strTables
+ @strFilterCrite ria + @strGroupCriter ia + @strSortCriteri a + ') ' +
@strSimpleFilte r +
@strGroupCriter ia +
@strSortCriteri a + ') ' +
@strGroupCriter ia +
@strSortCriteri a
)
END
--IF WE NEED TO RETURN THE RECORDCOUNT
IF @blnGetRecordCo unt = 1
IF @strGroupCriter ia != ''
EXEC (
'SELECT COUNT(*) AS RECORDCOUNT FROM (SELECT COUNT(*) FROM ' + @strTables
+ @strFilterCrite ria + @strGroupCriter ia + ') AS tbl (id)'
)
ELSE
EXEC (
'SELECT COUNT(*) AS RECORDCOUNT FROM ' + @strTables + @strFilterCrite ria
+ @strGroupCriter ia
)
GO
SQL QA. I can access the Recordset with no problem. How can I grab the
Recordcount with ASP code at the same time I'm getting the Recordset? In QA,
the RecordCount displays below the Recordset.
The below USAGE code will display my SPROC results.
USAGE:
EXEC SELECT_WITH_PAG ING 'CustomerID, ShipName', 'OrderID',
'Northwind.dbo. Orders', 3, 10, 1, '', 'OrderDate' *************** *********
LISTING 1: ASP CODE
Set objConn = CreateObject("A DODB.Connection ")
objConn.Open myDSN
Set objRS = Server.CreateOb ject("ADODB.Rec ordset")
strSQL = "SELECT_WITH_PA GING " & SParms
objRS.Open strSQL, objConn
*************** *********
LISTING 2: SPROC
CREATE PROCEDURE SELECT_WITH_PAG ING (
@strFields VARCHAR(4000) ,
@strPK VARCHAR(100),
@strTables VARCHAR(4000),
@intPageNo INT = 1,
@intPageSize INT = NULL,
@blnGetRecordCo unt BIT = 0,
@strFilter VARCHAR(8000) = NULL,
@strSort VARCHAR(8000) = NULL,
@strGroup VARCHAR(8000) = NULL
)
AS
DECLARE @blnBringAllRec ords BIT
DECLARE @strPageNo VARCHAR(50)
DECLARE @strPageSize VARCHAR(50)
DECLARE @strSkippedRows VARCHAR(50)
DECLARE @strFilterCrite ria VARCHAR(8000)
DECLARE @strSimpleFilte r VARCHAR(8000)
DECLARE @strSortCriteri a VARCHAR(8000)
DECLARE @strGroupCriter ia VARCHAR(8000)
DECLARE @intRecordcount INT
DECLARE @intPagecount INT
--******** NORMALIZE THE PAGING CRITERIA
--if no meaningful inputs are provided, we can avoid paging and execute a
more efficient query, so we will set a flag that will help with that
(blnBringAllRec ords)
IF @intPageNo < 1
SET @intPageNo = 1
SET @strPageNo = CONVERT(VARCHAR (50), @intPageNo)
IF @intPageSize IS NULL OR @intPageSize < 1 -- BRING ALL RECORDS, DON'T DO
PAGING
SET @blnBringAllRec ords = 1
ELSE
BEGIN
SET @blnBringAllRec ords = 0
SET @strPageSize = CONVERT(VARCHAR (50), @intPageSize)
SET @strPageNo = CONVERT(VARCHAR (50), @intPageNo)
SET @strSkippedRows = CONVERT(VARCHAR (50), @intPageSize * (@intPageNo -
1))
END
--******** NORMALIZE THE FILTER AND SORTING CRITERIA
--if they are empty, we will avoid filtering and sorting, respectively,
executing more efficient queries
IF @strFilter IS NOT NULL AND @strFilter != ''
BEGIN
SET @strFilterCrite ria = ' WHERE ' + @strFilter + ' '
SET @strSimpleFilte r = ' AND ' + @strFilter + ' '
END
ELSE
BEGIN
SET @strSimpleFilte r = ''
SET @strFilterCrite ria = ''
END
IF @strSort IS NOT NULL AND @strSort != ''
SET @strSortCriteri a = ' ORDER BY ' + @strSort + ' '
ELSE
SET @strSortCriteri a = ''
IF @strGroup IS NOT NULL AND @strGroup != ''
SET @strGroupCriter ia = ' GROUP BY ' + @strGroup + ' '
ELSE
SET @strGroupCriter ia = ''
--*************** *********** NOW START DOING THE REAL WORK
--!NOTE: for potentially improved performance, use sp_executesql instead of
EXEC
IF @blnBringAllRec ords = 1 --ignore paging and run a simple select
BEGIN
EXEC (
'SELECT ' + @strFields + ' FROM ' + @strTables + @strFilterCrite ria +
@strGroupCriter ia + @strSortCriteri a
)
END-- WE HAD TO BRING ALL RECORDS
ELSE --BRING ONLY A PARTICULAR PAGE
BEGIN
IF @intPageNo = 1 --in this case we can execute a more efficient query,
with no subqueries
EXEC (
'SELECT TOP ' + @strPageSize + ' ' + @strFields + ' FROM ' + @strTables +
@strFilterCrite ria + @strGroupCriter ia + @strSortCriteri a
)
ELSE --execute a structure of subqueries that brings the correct page
EXEC (
'SELECT ' + @strFields + ' FROM ' + @strTables + ' WHERE ' + @strPK + '
IN ' + '
(SELECT TOP ' + @strPageSize + ' ' + @strPK + ' FROM ' + @strTables +
' WHERE ' + @strPK + ' NOT IN ' + '
(SELECT TOP ' + @strSkippedRows + ' ' + @strPK + ' FROM ' + @strTables
+ @strFilterCrite ria + @strGroupCriter ia + @strSortCriteri a + ') ' +
@strSimpleFilte r +
@strGroupCriter ia +
@strSortCriteri a + ') ' +
@strGroupCriter ia +
@strSortCriteri a
)
END
--IF WE NEED TO RETURN THE RECORDCOUNT
IF @blnGetRecordCo unt = 1
IF @strGroupCriter ia != ''
EXEC (
'SELECT COUNT(*) AS RECORDCOUNT FROM (SELECT COUNT(*) FROM ' + @strTables
+ @strFilterCrite ria + @strGroupCriter ia + ') AS tbl (id)'
)
ELSE
EXEC (
'SELECT COUNT(*) AS RECORDCOUNT FROM ' + @strTables + @strFilterCrite ria
+ @strGroupCriter ia
)
GO
Comment