SPROC记录 [英] SPROC Recordcount

查看:58
本文介绍了SPROC记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆