存储过程-分页,为过程或函数 ##指定的参数太多

发布:2010-12-18 11:23   点击523次   评论:0

 

为过程或函数 ##指定的参数太多

如果你的参数添加是在循环体内完成的,  
  第2次时就会重复添加,此时触发参数过多异常  
   
解决方法1,参数在循环体外添加,for内部只赋值和取返回值  
解决方法2,每次循环清空参数Parameters.Clear();

CreateParameter定义和用法

.Parameters.Append .CreateParameter("@test_no",200,1,48,test_no)

CreateParameter 方法可创建和返回一个 Parameter 对象,该对象包含指定的属性,比如名称、类型、方向、大小和值。

语法 (name,type,direction,size,value)参数 描述
name 可选。Parameter 对象的名称。
type 可选。DataTypeEnum 常量之一,指定 Parameter 对象的数据类型。默认是 adEmpty。如果你选择可变长度的数据类型,则需要规定 Size 参数或 Size 属性。如果规定 adDecimal 或者 adNumeric 数据类型,则必须设置 Parameter 对象的NumericScale 和 Precision 属性。
direction 可选。ParameterDirectionEnum 常量之一,定义 Parameter 对象的方向。默认是 adParamInput。
size 可选。规定可变数据类型的长度,假如此类类型被声明于 Type 参数中。默认是 0。
value 可选。Parameter 对象的值。

ParameterDirectionEnum 值
指定 Parameter 所表示的是输入参数、输出参数、既是输出又是输入参数,还是存储过程返回的值。

常量 值 描述
adParamUnknown 0 指示该参数的方向未知。
adParamInput 1 默认值。指示该参数是输入参数
adParamOutput 2 指示该参数是输出参数。
adParamInputOutput 3 指示该参数既是输入参数,又是输出参数。
adParamReturnValue 4 指示该参数是返回值。

DataTypeEnum 值
规定 Field, Parameter 或 Property 对象的数据类型:

常量 值 描述
adEmpty 0 没有值 (DBTYPE_EMPTY)。
adSmallInt 2 一个双字节的有符号整数 (DBTYPE_I2)。
adInteger 3 一个四字节的有符号整数 (DBTYPE_I4)。
adSingle 4 一个单精度浮点值 (DBTYPE_R4)。
adDouble 5 一个双精度浮点值 (DBTYPE_R8)。
adCurrency 6 一个货币值 (DBTYPE_CY)。货币是一个定点数字,小数点右侧有四位数字。该值存储为八字节、范围为 10,000 的有符号整数。
adDate 7 日期值 (DBTYPE_DATE)。日期保存为双精度数,数字的整数部分是从 1899 年 12 月 30 日算起的天数,小数部分是一天当中的片段时间。
adBSTR 8 以 Null 终止的字符串 (Unicode) (DBTYPE_BSTR)。
adIDispatch 9 指向 COM 对象上 IDispatch 接口的指针 (DBTYPE_IDISPATCH)。
adDecimal 14 具有固定精度和范围的确切数字值 (DBTYPE_DECIMAL)。
adTinyInt 16 一个单字节的有符号整数 (DBTYPE_I1)。
adUnsignedTinyInt 17 一个单字节的无符号整数 (DBTYPE_UI1)。
adUnsignedSmallInt 18 一个双字节的无符号整数 (DBTYPE_UI2)。
adUnsignedInt 19 一个四字节的无符号整数 (DBTYPE_UI4)。
adBigInt 20 一个八字节的有符号整数 (DBTYPE_I8)。
adUnsignedBigInt 21 一个八字节的无符号整数 (DBTYPE_UI8)。
adFileTime 64 一个 64 位的值,表示从 1601 年 1 月 1 日开始的 100 个十亿分之一秒间隔的数量 (DBTYPE_FILETIME)。
adGUID 72 全局唯一标识符 (GUID) (DBTYPE_GUID)。
adBinary 128 一个二进制值 (DBTYPE_BYTES)。
adChar 129 一个字符串值 (DBTYPE_STR)。.
adWChar 130 一个以 Null 终止的 Unicode 字符串 (DBTYPE_WSTR)。
adNumeric 131 具有固定精度和范围的确切数字值 (DBTYPE_NUMERIC)。
adUserDefined 132 一个用户定义的变量 (DBTYPE_UDT)。
adDBDate 133 日期值 (yyyymmdd) (DBTYPE_DBDATE)。
adDBTime 134 时间值 (hhmmss) (DBTYPE_DBTIME)。
adDBTimeStamp 135 日期/时间戳(yyyymmddhhmmss 加十亿分之一的小数)(DBTYPE_DBTIMESTAMP)。
adChapter 136 一个四字节的子集值,标识子行集合中的行 (DBTYPE_HCHAPTER)。
adPropVariant 138 一个 Automation PROPVARIANT (DBTYPE_PROP_VARIANT)。
adVarNumeric 139 一个数字值(仅限于 Parameter 对象)。
adVarChar 200 一个字符串值(仅限于 Parameter 对象)。
adLongVarChar 201 一个长字符串值(仅限于 Parameter 对象)。
adVarWChar 202 一个以 Null 终止的 Unicode 字符串(仅限于 Parameter 对象)。
adLongVarWChar 203 一个以 Null 终止的长 Unicode 字符串值(仅限于 Parameter 对象)。
adVarBinary 204 一个二进制值(仅限于 Parameter 对象)。
adLongVarBinary 205 一个长二进制值(仅限于 Parameter 对象)。
AdArray 0x2000 一个标志值,通常与另一个数据类型常量组合,指示该数据类型的数组。




导入 --- 删除,增加:
CREATE PROCEDURE spImpRep3(
  @test_no nVARCHAR(48),
  @item_no INT,  
  @print_order INT,             
  @report_item_name nVARCHAR(48),         
  @report_item_code INT, 
  @result nVARCHAR(48), 
  @units nVARCHAR(48),
  @abnormal_indicator nVARCHAR(48),
  @instrument_id nVARCHAR(48),
  @result_date_time DateTime,
  @print_context nVARCHAR(48)

    AS

DELETE FROM MemRRes WHERE test_no=@test_no AND item_no=@item_no;
 
INSERT INTO MemRRes
(test_no,item_no,print_order,report_item_name,report_item_code
,result,units,abnormal_indicator,instrument_id,result_date_time
,print_context)
values
(@test_no,@item_no,@print_order,@report_item_name,@report_item_code
,@result,@units,@abnormal_indicator,@instrument_id,@result_date_time
,@print_context);
    GO

SPGetVal
CREATE PROCEDURE SPGetVal(
@TabWhere nVARCHAR(3200),   --不带排序语句的SQL语句
@ColVal nVARCHAR(3200) OUTPUT

AS
DECLARE @sql1 nVARCHAR(3200)
DECLARE @OutVal nVARCHAR(3200)
SET @OutVal = ''''
  SET @sql1 = N''SELECT @ColVal=''+ @TabWhere 
  EXEC sp_executesql @sql1,N''@ColVal  nVARCHAR(3200)  OUTPUT'',@ColVal OUTPUT
GO

通用分页SPGetPage
CREATE PROCEDURE SPGetPage(
@TabCols nVARCHAR(3200),
@TabWhere nVARCHAR(3200),   --不带排序语句的SQL语句
@PagNow INT,              --页码
@PagSize INT,             --每页容纳的记录数
@KeyID VARCHAR(255),      --需要排序的不重复的ID号
@KeySort VARCHAR(255),    --排序字段及规则
@PagCount INT OUTPUT,     --返回总页数
@RecCount INT OUTPUT      --输入最大记录数,返回总记录
) AS
DECLARE @SQLStr nVARCHAR(3200)
SET @SQLStr = @TabCols + ''  FROM '' + @TabWhere
DECLARE @MaxRow INT
SET @MaxRow = @RecCount
BEGIN
  DECLARE @sql1 nVARCHAR(3200)
  SET @sql1 = N''SELECT @RecCount=COUNT(*)''+ N'' FROM ''+ @TabWhere 
  EXEC sp_executesql @sql1,N''@RecCount INT OUTPUT'',@RecCount OUTPUT
    --IF @RecCount > @MaxRow
    --BEGIN    
       --SET @RecCount = @MaxRow
    --END
  SET @PagCount = (@RecCount+@PagSize-1)/@PagSize
END
BEGIN
  DECLARE @Str nVARCHAR(3200)
  SET @Str = ''SELECT   TOP '' + CAST(@PagSize AS VARCHAR(12)) + '' *
    FROM ('' + @SQLStr+'') T WHERE T.'' + @KeyID + ''
    NOT IN (SELECT   TOP '' + CAST((@PagSize*(@PagNow-1)) AS VARCHAR(12)) + '' '' + @KeyID + ''
    FROM ('' + @SQLStr + '') T9 ORDER BY '' + @KeySort + '') ORDER BY '' + @KeySort

  DECLARE @Str1 nVARCHAR(320)
  DECLARE @Str2 nVARCHAR(320)
  SET @Str1 = CAST(@PagSize AS VARCHAR(12))
  SET @Str2 = CAST((@PagSize*(@PagNow-1)) AS VARCHAR(12))
  EXEC ( N''SELECT   TOP ''+ @Str1 + N'' * FROM ('' + @SQLStr + N'') T WHERE T.'' + @KeyID + N''
    NOT IN (SELECT   TOP '' + @Str2+N'' '' + @KeyID + N'' FROM ('' + @SQLStr + N'') T9
    ORDER BY ''+@KeySort + N'') ORDER BY '' + @KeySort )
END
GO

千万数量级分页存储过程
Create PROCEDURE SPGetPag2
/*
***************************************************************
** 千万数量级分页存储过程 **
***************************************************************
参数说明:
1.Tables :表名称,视图
2.PrimaryKey :主关键字
3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
4.CurrentPage :当前页码
5.PageSize :分页尺寸
6.Filter :过滤语句,不带Where
7.Group :Group语句,不带Group By
效果演示:http://www.cn5135.com/_App/Enterprise/QueryResult.aspx
***************************************************************/
(
@Tables varchar(1000),
@PrimaryKey varchar(100),
@Sort varchar(200) = NULL,
@CurrentPage int = 1,
@PageSize int = 10,
@Fields varchar(1000) = ''*'',
@Filter varchar(1000) = NULL,
@Group varchar(1000) = NULL
)
AS
/*默认排序*/
IF @Sort IS NULL or @Sort = ''''
SET @Sort = @PrimaryKey
DECLARE @SortTable varchar(100)
DECLARE @SortName varchar(100)
DECLARE @strSortColumn varchar(200)
DECLARE @operator char(2)
DECLARE @type varchar(100)
DECLARE @prec int
/*设定排序语句.*/
IF CHARINDEX(''DESC'',@Sort)>0
BEGIN
SET @strSortColumn = REPLACE(@Sort, ''DESC'', '''')
SET @operator = ''<=''
END
ELSE
BEGIN
IF CHARINDEX(''ASC'', @Sort) = 0
SET @strSortColumn = REPLACE(@Sort, ''ASC'', '''')
SET @operator = ''>=''
END
IF CHARINDEX(''.'', @strSortColumn) > 0
BEGIN
SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX(''.'',@strSortColumn))
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX(''.'',@strSortColumn) + 1, LEN(@strSortColumn))
END
ELSE
BEGIN
SET @SortTable = @Tables
SET @SortName = @strSortColumn
END
Select @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
Where o.name = @SortTable AND c.name = @SortName
IF CHARINDEX(''char'', @type) > 0
SET @type = @type + ''('' + CAST(@prec AS varchar) + '')''
DECLARE @strPageSize varchar(50)
DECLARE @strStartRow varchar(50)
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
DECLARE @strGroup varchar(1000)
/*默认当前页*/
IF @CurrentPage < 1
SET @CurrentPage = 1
/*设置分页参数.*/
SET @strPageSize = CAST(@PageSize AS varchar(50))
SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(50))
/*筛选以及分组语句.*/

IF @Filter IS NOT NULL AND @Filter != ''''
BEGIN
SET @strFilter = '' Where '' + @Filter + '' ''
SET @strSimpleFilter = '' AND '' + @Filter + '' ''
END
ELSE
BEGIN
SET @strSimpleFilter = ''''
SET @strFilter = ''''
END
IF @Group IS NOT NULL AND @Group != ''''
SET @strGroup = '' GROUP BY '' + @Group + '' ''
ELSE
SET @strGroup = ''''
/*执行查询语句*/
EXEC(
''
DECLARE @SortColumn '' + @type + ''
SET ROWCOUNT '' + @strStartRow + ''
Select @SortColumn='' + @strSortColumn + '' FROM '' + @Tables + @strFilter + '' '' + @strGroup + '' orDER BY '' + @Sort + ''
SET ROWCOUNT '' + @strPageSize + ''
Select '' + @Fields + '' FROM '' + @Tables + '' Where '' + @strSortColumn + @operator + '' @SortColumn '' + @strSimpleFilter + '' '' + @strGroup + '' orDER BY '' + @Sort + ''
''
)
GO

SPGetList
CREATE PROCEDURE SPGetList(
@SqlStr nVARCHAR(3200)
--,@RecCount INT OUTPUT
) AS
EXEC sp_executesql @SqlStr
--SET @RecCount = @@RowCount
GO

SPGetCount
CREATE PROCEDURE SPGetCount(
@TabWhere nVARCHAR(3200),   --不带排序语句的SQL语句
@RecCount INT OUTPUT

AS
DECLARE @sql1 nVARCHAR(3200)
  SET @sql1 = N''SELECT @RecCount=COUNT(*)''+ N'' FROM ''+ @TabWhere 
  EXEC sp_executesql @sql1,N''@RecCount INT OUTPUT'',@RecCount OUTPUT
GO

SPDoSql
CREATE PROCEDURE SPDoSql(
@SQLStr nVARCHAR(3200)

AS
  EXEC sp_executesql @SQLStr
  --EXEC  @SQLStr
GO

rs_SPPage
Function rs_SPPage(xConn,xTabCols,xTabWhere,xPagNow,xPagSize,xKeyID,xKeySort,xRSPage)
  Dim cm
  Set cm = Server.CreateObject("ADODB.Command")
  With cm
    .ActiveConnection = xConn
    .CommandText = "SPGetPage" ''指定存储过程名
    .CommandType = 4 ''表明这是一个存储过程
    .Prepared = true ''要求将SQL命令先行编译 true false
    .Parameters.Append .CreateParameter("@TabCols" ,200,1,3200,xTabCols)
    .Parameters.Append .CreateParameter("@TabWhere",200,1,3200,xTabWhere)
    .Parameters.Append .CreateParameter("@PagNow"  ,3  ,1,4   ,xPagNow)
    .Parameters.Append .CreateParameter("@PagSize" ,3  ,1,4   ,xPagSize)
    .Parameters.Append .CreateParameter("@KeyID"   ,200,1,255 ,xKeyID)
    .Parameters.Append .CreateParameter("@KeySort" ,200,1,255 ,xKeySort)
    .Parameters.Append .CreateParameter("@PagCount",3  ,4)
    .Parameters.Append .CreateParameter("@RecCount",3  ,3,4   ,1200)
    Set xRSPage(0) = .Execute()
  End With
  If xRSPage(0).State = 0 Then ''未取到数据,rs关闭
 xRSPage(1) = -1
 xRSPage(2) = -1
  Else
    xRSPage(0).Close ''注意:若要取得参数值,需先关闭记录集对象
 xRSPage(1) = cm("@RecCount")
 xRSPage(2) = cm("@PagCount")
  End If
  Set cm = Nothing
End Function

关于 GitHub 导航 部门 反馈

提示:`/home.php`入口数据仅为演示功能,不构成任何交易凭证,也不承担相关风险和责任!

Copyright © 2011-2018 xxxxx.com All rights reserved.

Run:4.061/30.001(ms); 7(sql)/2.921(MB); comm:news/detail; Upd:2024-05-05 21:41:07