Red de conocimiento informático - Material del sitio web - ¿Es válida la paginación basada en los procedimientos almacenados del sistema sp_cursoropen, sp_cursororfetch y sp_cursorclose?

¿Es válida la paginación basada en los procedimientos almacenados del sistema sp_cursoropen, sp_cursororfetch y sp_cursorclose?

Requiere muchos recursos y el efecto es obvio cuando la cantidad de datos es grande.

Si desea paginar, puede utilizar el siguiente método:

ALTER PROC sp_PageView: un procedimiento almacenado de paginación universal implementado por TOP n

@tbname sysname, - - El nombre de la tabla que se va a paginar

@FieldKey nvarchar(1000), -- Clave principal (la clave para ubicar el registro), utilizada para ubicar el campo de clave principal (clave única) del registro, que puede ser varios campos separados por comas

@PageCurrent int=1, -- el número de página que se mostrará

@PageSize int=10, -- el tamaño de cada página (número de registros)

@FieldShow nvarchar(1000)='', -- Nombres de tablas separados por comas, mostrados durante la paginación

@FieldShow nvarchar(1000)= '', -- Nombres de tablas separados por comas, mostrados con Mostrado en paginación

@FieldKey nvarchar(1000), - usado para ubicar registros, - usado para ubicar registros, - usado para mostrar registros.

-- Una lista de campos separados por comas para mostrar, o todos los campos si no se especifican

@FieldOrder nvarchar(1000)='', -- Una lista de campos separados por comas para ordenar, ok Especifique DESC /ASC después del campo para especificar el orden de clasificación

@Where nvarchar(1000)='', --condiciones de consulta

@PageCount int SALIDA --Número total de páginas

p>

AS

ESTABLECER NOCOUNT ON

--Compruebe si el objeto es válido

SI OBJECT_ID(@tbname) ES NULL

BEGIN

RAISERROR(N'El objeto "%s" no existe', 1,16,@tbname)

RETURN

END

IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0

AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0

AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0

BEGIN

RAISERROR(N'"%s" no es una tabla, vista o función con valores de tabla ',1,16,@tbname)

RETURN

END

--Comprobación del campo de paginación

IF ISNULL(@FieldKey, N'')=''

BEGIN

RAISERROR(N'El procesamiento de paginación requiere una clave primaria (o clave única)', 1,16)

RETURN

END

--Otras comprobaciones y especificaciones de parámetros

ISNULL(@PageCurrent,0) <1 SET @ PageCurrent =1

IF ISNULL(@PageSize,0) <1 SET @PageSize=10

IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N ''*'

SI ES NULL( @FieldOrder,N'')=N''

SET @FieldOrder=N''

ELSE

SET @FieldOrder=N' ORDER BY '+LTRIM(@FieldOrder)

IF ISNULL(@Where.N'')=N''

SET @Where =N''

ELSE

SET @Where=N'WHERE ('+@Where+N')'

--Si @PageCount es un Valor NULL, calcula el número total de páginas (diseñado así. El propósito es que solo puedas calcular el número total de páginas la primera vez y luego en llamadas posteriores.

En llamadas posteriores, el número total de páginas se devolverá al procedimiento almacenado para evitar calcular el número total de páginas nuevamente. Esto está diseñado para aquellos que no desean calcular el número total de páginas. para calcular el número total de páginas, puede asignar un valor a @PageCount )

IF @PageCount IS NULL

BEGIN

DECLARE @sql nvarchar(. 4000)

SET @sql nvarchar(4000)

SET @sqlnvarchar(4000)

SET @sql nvarchar(4000)

SET @sql=N'SELECT @PageCount=COUNT(*)'

+N'FROM '+@tbname

+N''+@Dónde

EXEC sp_executesql @sql, N'@PageCount int SALIDA', @PageCount SALIDA

SET @PageCount=(@PageCount+@PageSize-1)/@PageSize

END

-- Calcular el valor de TOPN para la visualización de paginación

DECLARAR @TopN varchar(20),@TopN1 varchar(20)

SELECT @TopN=@PageSize,

@TopN1=(@PageCurrent-1)*@PageSize

--Muestra directamente la primera página

IF @ PageCurrent=1

EXEC(N'SELECT TOP '+@TopN

+N' '+@FieldShow

+N' FROM '+@tbname

+N' '+@Dónde

+N' '+@FieldOrder )

ELSE

BEGIN

--Manejo de alias

IF @FieldShow=N'*'

SET @FieldShow=N'a.*'

--Generar condiciones de procesamiento de clave primaria (clave única)

DECLARAR @Dónde1 nvarchar(4000),@Dónde2 nvarchar(4000),

@s nvarchar(1000),@Campo nombre del sistema

SELECCIONAR @Dónde1=N'', @Where2=N'',@s=@FieldKey

MIENTRAS CHARINDEX(N',',@s)>0

SELECT @Field=LEFT(@s,CHARINDEX (N',',@s)-1),

@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),

@Dónde1=@Dónde1+N' AND a.'+@Campo+ N'=b.'+@Campo,

@Dónde2=@Dónde2+N' Y b.'+@Campo +N' ES NULO',

@Dónde=REPLACE (@Dónde,@Campo N'a.'+@Campo),

@FieldOrder=REPLACE(@FieldOrder,@ Campo,N'a.'+@Campo),

@FieldShow=REPLACE(@FieldShow,@Campo,N'a.'+@ Campo)

SELECT @Dónde= REEMPLAZAR(@Dónde,@s,N'a.'+@s), <

/p>

@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),

@FieldShow=REPLACE(@FieldShow,@s,N'a.' +@s),

@Where1=STUFF(@Donde1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),

@Dónde2=CASE

CUANDO @Dónde=' ' ENTONCES N'DÓNDE ('

ELSE @Dónde+N' AND ('

END+N'b.'+@s+N' IS NULL'+@Where2+N')'

--Ejecutar consulta

EXEC(N'SELECT TOP '+@TopN

+N' '+@FieldShow

+N' FROM'+@tbname

+N' a UNIRSE A LA IZQUIERDA (SELECCIONAR ARRIBA ' +@TopN1

+N' '+@FieldKey

+N' FROM'+@tbname

+N'a '+@Dónde

+N' '+@FieldOrder

+N')b ON '+@Dónde1

+N' '+@Dónde2

+ N' '+@FieldOrder)

END

/*

declara @PageCount int

exec sp_PageView

SA_Order,

iId,

5,

50,

'iId,dDate,cVouchId',--separados por comas Una lista de campos que se mostrarán; si no se especifica, se muestran todos los campos

iId, - Una lista de campos de clasificación separados por comas, se puede especificar DESC/ASC después del campo para especificar el orden de clasificación

'', - condiciones de consulta

@PageCount

*/

GO