SPROC记录 [英] SPROC Recordcount
问题描述
在LISTING 2中,我有一个SPROC,它在
SQL QA中返回记录集和记录数。我可以毫无问题地访问Recordset。如何在获取Recordset的同时使用ASP代码获取
记录计数?在质量保证中,
RecordCount显示在Recordset下方。
以下USAGE代码将显示我的SPROC结果。
使用:
EXEC SELECT_WITH_PAGING''CustomerID,ShipName'',''OrderID'',
''Northwind.dbo.Orders'',3,10, 1,'''',''OrderDate''************************
上市1:ASP代码
设置objConn = CreateObject(" ADODB.Connection")
objConn.Open myDSN
设置objRS = Server.CreateObject(" ADODB。记录集)
strSQL =" SELECT_WITH_PAGING" &安培; SPARMS
objRS.Open strSQL,objConn
******************* *****
上市2:SPROC
创建程序SELECT_WITH_PAGING(
@strFields VARCHAR(4000),
@strPK VARCHAR(100),
@strTables VARCHAR(4000),
@intPageNo INT = 1,
@intPageSize INT = NULL,
@blnGetRecordCount BIT = 0,
@strFilter VARCHAR(8000)= NULL,
@strSort VARCHAR(8000 )= NULL,
@strGroup VARCHAR(8000)= NULL
)
AS
DECLARE @blnBringAllRecords BIT
DECLARE @strPageNo VARCHAR(50)
DECLARE @strPageSize VARCHAR(50)
DECLARE @strSkippedRows VARCHAR(50)
DECLARE @strFilterCriteria VARCHAR(8000)
DECLARE @strSimpleFilter VARCHAR(8000)
DECLARE @strSortCriteria VARCHAR(8000)
DECLARE @strGroupCriteria VARCHAR(8000)
DECLARE @intRecordcount INT
DEC LARE @intPagecount INT
- ********正常化PAGING标准
- 如果没有提供有意义的输入,我们可以避免分页和执行
更有效的查询,所以我们将设置一个标志,以帮助它
(blnBringAllRecords)
IF @intPageNo< ; 1
SET @intPageNo = 1
SET @strPageNo = CONVERT(VARCHAR(50),@ intPageNo)
IF @intPageSize IS NULL或@intPageSize< 1 - 带来所有记录,不要做
PAGING
SET @bnnBringAllRecords = 1
ELSE
BEGIN
SET @blnBringAllRecords = 0
SET @strPageSize = CONVERT(VARCHAR(50),@ intSize)
SET @strPageNo = CONVERT (VARCHAR(50),@ intPageNo)
SET @strSkippedRows = CONVERT(VARCHAR(50),@ intSize *(@intPageNo -
1))
结束
- ********正常化过滤器和分类标准
- 如果它们是空的,我们将避免过滤和排序,分别是,
执行更有效的查询
如果@strFilter IS NOT NULL且@strFilter!=''''
BEGIN
SET @strFilterCriteria =''WHERE''+ @strFilter +''''
SET @strSimpleFilter =''AND''+ @strFilter +''' '
结束
ELSE
BEGIN
SET @strSimpleFilter =''''
SET @strFilterCriteria =''''
结束
如果@strSort不为空且@strSort!=''''
SET @strSortCriteria =''订购BY''+ @strSort +''''
ELSE
SET @strSortCriteria =''''
IF @ strGroup IS NOT NULL AND @strGroup!=''''
SET @strGroupCriteria =''GROUP BY''+ @strGroup +''''
ELSE
SET @strGroupCriteria =''''
- ********************** ****现在开始做真正的工作
- !注意:为了提高性能,请使用sp_executesql而不是
EXEC
IF @blnBringAllRecords = 1 - 签名并进行简单的选择
BEGIN
EXEC(
'' SELECT''+ @strFields +''FROM''+ @strTables + @strFilterCriteria +
@strGroupCriteria + @strSortCriteria
)
结束 - 我们要带来所有记录
ELSE --BRIN G只有一个特殊的页面
BEGIN
如果@intPageNo = 1 - 在这种情况下我们可以执行更有效的查询,
没有子查询
EXEC(
''SELECT TOP''+ @strPageSize +''''+ @strFields +''FROM''+ @strTables +
@strFilterCriteria + @strGroupCriteria + @strSortCriteria
)
ELSE - 执行带有正确页面的子查询结构
执行(
''SELECT''+ @strFields +''FROM''+ @strTables +''WHERE''+ @strPK +''
IN'' +''
(SELECT TOP''+ @strPageSize +''''+ @strPK +''FROM''+ @strTables +
''WHERE'' + @strPK +''不在'''''
(选择TOP''+ @strSkippedRows +''''+ @strPK +''FROM''+ @strTables
+ @strFilterCriteria + @strGroupCriteria + @strSortCriteria +'')''+
@strSimpleFilter +
@strGroupCriteria +
@strSortCriteria +'')''+
@strGroupCriteria +
@strSortCriteria
)
结束
- 我们需要退回记录金额
IF @blnGetRecordCount = 1
IF @strGroupCriteria!=''''
EXEC(
''SELECT COUNT(*)AS RECORDCOUNT FROM(SELECT COUNT(*)FROM''+ @strTables
+ @strFilterCriteria + @strGroupCriteria +'')AS tbl(id)''
)
ELSE
EXEC(
''SELECT COUNT(*)作为RECORDCOUNT来自''+ @strTables + @strFilterCriteria
+ @strGroupCriteria
)
GO
scott写道:< blockquote class =post_quotes>在LISTING 2中,我有一个SPROC,它在SQL QA中返回记录集和
记录计数。我可以毫无问题地访问Recordset。
如何在获取Recordset的同时使用ASP代码获取Recordcount?在QA中,RecordCount显示在
Recordset下面。
以下USAGE代码将显示我的SPROC结果。
使用:
EXEC SELECT_WITH_PAGING'' CustomerID,ShipName'',''OrderID'',
''Northwind.dbo.Orders'',3,10,1,'''',''OrderDate''
**** ********************列表1:ASP代码
设置objConn = CreateObject(" ADODB.Connection")
objConn.Open myDSN
设置objRS = Server.CreateObject(" ADODB.Recordset")
strSQL =" SELECT_WITH_PAGING" &安培; SPARMS
objRS.Open strSQL,objConn
*********************** *
上市2:SPROC
创建程序SELECT_WITH_PAGING(
@strFields VARCHAR(4000),
@strPK VARCHAR(100),
@strTables VARCHAR (4000),
@ intPageNo INT = 1,
@intPageSize INT = NULL,
@ bbnGetRecordCount BIT = 0,
@strFilter VARCHAR(8000)= NULL,> @strSort VARCHAR(8000)= NULL,
@strGroup VARCHAR(8000)= NULL
AS
< snip>
- 如果我们需要返回记录账号
如果@blnGetRecordCount = 1
IF @strGroupCriteria!=''''
EXEC(
''SELECT COUNT(*)作为记录来自( SELECT COUNT(*)FROM''+
@strTables + @strFilterCriteria + @strGroupCriteria +'')AS tbl(id)''
)
ELEC
EXEC(
''SELECT COUNT(*)AS RECORDCOUNT来自''+ @strTables +
@strFilterCriteria + @strGroupCriteria
)
GO
我会留给别人评论动态sql的使用(想想sql
注射)......
您将返回包含计数的第二个结果集,因此您将使用
记录集的NextRecordset方法来访问它:
>
set objRS = objRS.NextRecordset
reccount = objRS(" recordcount")
我更倾向于使用输出参数,使用Command对象
来检索值。
Bob Barrows
-
Microsoft MVP - ASP / ASP.NET
请回复新闻组。我的From
标题中列出的电子邮件帐户是我的垃圾邮件陷阱,因此我不经常检查它。通过发布到新闻组,您将获得更快的回复。
Bob Barrows [MVP]写道:
我更倾向于使用输出参数,使用一个Command对象来检索值。
可以用你喜欢的SP-as -method-of-connection技术[1]处理输出
参数?
[1]我不使用它因为它似乎不是在JScript工作
-
戴夫安德森
未经请求的商业电子邮件将以
<的成本阅读br />
每条消息500。使用
此电子邮件地址即表示同意这些条款。请不要直接联系
我或要求我直接与您联系以获取帮助。如果您的
问题值得询问,那就值得发帖。
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_PAGING ''CustomerID, ShipName'', ''OrderID'',
''Northwind.dbo.Orders'', 3, 10, 1, '''', ''OrderDate'' ************************
LISTING 1: ASP CODE
Set objConn = CreateObject("ADODB.Connection")
objConn.Open myDSN
Set objRS = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT_WITH_PAGING " & SParms
objRS.Open strSQL, objConn
************************
LISTING 2: SPROC
CREATE PROCEDURE SELECT_WITH_PAGING (
@strFields VARCHAR(4000) ,
@strPK VARCHAR(100),
@strTables VARCHAR(4000),
@intPageNo INT = 1,
@intPageSize INT = NULL,
@blnGetRecordCount BIT = 0,
@strFilter VARCHAR(8000) = NULL,
@strSort VARCHAR(8000) = NULL,
@strGroup VARCHAR(8000) = NULL
)
AS
DECLARE @blnBringAllRecords BIT
DECLARE @strPageNo VARCHAR(50)
DECLARE @strPageSize VARCHAR(50)
DECLARE @strSkippedRows VARCHAR(50)
DECLARE @strFilterCriteria VARCHAR(8000)
DECLARE @strSimpleFilter VARCHAR(8000)
DECLARE @strSortCriteria VARCHAR(8000)
DECLARE @strGroupCriteria 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
(blnBringAllRecords)
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 @blnBringAllRecords = 1
ELSE
BEGIN
SET @blnBringAllRecords = 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 @strFilterCriteria = '' WHERE '' + @strFilter + '' ''
SET @strSimpleFilter = '' AND '' + @strFilter + '' ''
END
ELSE
BEGIN
SET @strSimpleFilter = ''''
SET @strFilterCriteria = ''''
END
IF @strSort IS NOT NULL AND @strSort != ''''
SET @strSortCriteria = '' ORDER BY '' + @strSort + '' ''
ELSE
SET @strSortCriteria = ''''
IF @strGroup IS NOT NULL AND @strGroup != ''''
SET @strGroupCriteria = '' GROUP BY '' + @strGroup + '' ''
ELSE
SET @strGroupCriteria = ''''
--************************** NOW START DOING THE REAL WORK
--!NOTE: for potentially improved performance, use sp_executesql instead of
EXEC
IF @blnBringAllRecords = 1 --ignore paging and run a simple select
BEGIN
EXEC (
''SELECT '' + @strFields + '' FROM '' + @strTables + @strFilterCriteria +
@strGroupCriteria + @strSortCriteria
)
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 +
@strFilterCriteria + @strGroupCriteria + @strSortCriteria
)
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
+ @strFilterCriteria + @strGroupCriteria + @strSortCriteria + '') '' +
@strSimpleFilter +
@strGroupCriteria +
@strSortCriteria + '') '' +
@strGroupCriteria +
@strSortCriteria
)
END
--IF WE NEED TO RETURN THE RECORDCOUNT
IF @blnGetRecordCount = 1
IF @strGroupCriteria != ''''
EXEC (
''SELECT COUNT(*) AS RECORDCOUNT FROM (SELECT COUNT(*) FROM '' + @strTables
+ @strFilterCriteria + @strGroupCriteria + '') AS tbl (id)''
)
ELSE
EXEC (
''SELECT COUNT(*) AS RECORDCOUNT FROM '' + @strTables + @strFilterCriteria
+ @strGroupCriteria
)
GO
scott wrote: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_PAGING ''CustomerID, ShipName'', ''OrderID'',
''Northwind.dbo.Orders'', 3, 10, 1, '''', ''OrderDate''
************************ LISTING 1: ASP CODE
Set objConn = CreateObject("ADODB.Connection")
objConn.Open myDSN
Set objRS = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT_WITH_PAGING " & SParms
objRS.Open strSQL, objConn
************************
LISTING 2: SPROC
CREATE PROCEDURE SELECT_WITH_PAGING (
@strFields VARCHAR(4000) ,
@strPK VARCHAR(100),
@strTables VARCHAR(4000),
@intPageNo INT = 1,
@intPageSize INT = NULL,
@blnGetRecordCount BIT = 0,
@strFilter VARCHAR(8000) = NULL,
@strSort VARCHAR(8000) = NULL,
@strGroup VARCHAR(8000) = NULL
)
AS <snip>
--IF WE NEED TO RETURN THE RECORDCOUNT
IF @blnGetRecordCount = 1
IF @strGroupCriteria != ''''
EXEC (
''SELECT COUNT(*) AS RECORDCOUNT FROM (SELECT COUNT(*) FROM '' +
@strTables + @strFilterCriteria + @strGroupCriteria + '') AS tbl (id)''
)
ELSE
EXEC (
''SELECT COUNT(*) AS RECORDCOUNT FROM '' + @strTables +
@strFilterCriteria + @strGroupCriteria
)
GO
I will leave it to others to comment on this use of dynamic sql (think "sql
injection") ...
You''re returning a second resultset containing the count, so you would use
the recordset''s NextRecordset method to access it:
set objRS = objRS.NextRecordset
reccount=objRS("recordcount")
I would be more inclined to use an output parameter, using a Command object
to retrieve the value.
Bob Barrows
--
Microsoft MVP -- ASP/ASP.NET
Please reply to the newsgroup. The email account listed in my From
header is my spam trap, so I don''t check it very often. You will get a
quicker response by posting to the newsgroup.
Bob Barrows [MVP] wrote:
I would be more inclined to use an output parameter, using
a Command object to retrieve the value.
Can your preferred SP-as-method-of-connection technique[1] deal with output
parameters?
[1] I don''t use it because it seem not to work in JScript
--
Dave Anderson
Unsolicited commercial email will be read at a cost of
500 per message. Use
of this email address implies consent to these terms. Please do not contact
me directly or ask me to contact you directly for assistance. If your
question is worth asking, it''s worth posting.
这篇关于SPROC记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!