扩大
缩小
  

十三、自定义类型

用户定义数据类型

通俗定义:用户自己设计并实现的数据类型就称为用户自定义数据类型,即使这些数据类型基于系统数
据类型。也可以理解为基础类型的一个延伸。
用户定义数据类型三要素:
1. 数据类型的名称
2. 所基于的系统数据类型
3. 数据类型的可空性(是否可以为空)
USE[Advanced14]

GO
CREATE TYPE [dbo].[Age] FROM [int] NOT NULL 
用户定义表类型
定义:类型类似于一个表结构,使用基础类型包含了字段,可以用来作为存储过程的参数传递。
USE[Advanced14]

GO

CREATE TYPE [dbo].[PageParameter] AS TABLE(
[TableName] [varchar](50)NOT NULL,
[ReFieldsStr] [varchar](200)NOT NULL,
[OrderString] [varchar](200)NOT NULL,
[WhereString] [varchar](500)NOT NULL,
[PageSize] [int]NOT NULL,
[PageIndex][int]NOT NULL,
[TotalRecord][int]NOT NULL
)
---调用存储过程
DECLARE @PageParame PageParameter
INSERT INTO @PageParame VALUES ('Company','*','Id','',10,2,0) SELECT * FROM @PageParame
使用用户自定义表类型存储过程
USE[Advanced14]

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON 
GO


CREATE PROCEDURE [dbo].[SP_CustomPagerForTableType]
@PageParameter PageParameter READONLY,
@TotalRecord INT OUTPUT         --返回总记录数
AS
BEGIN

--select*from@PageParameter   --处理开始点和结束点
DECLARE @TableName VARCHAR(50);     --表名
  DECLARE @ReFieldsStr VARCHAR(200)='*'--字段名(全部字段为*)
  DECLARE @OrderString VARCHAR(200);    --排序字段(必须!支持多字段不用加orderby)  
  DECLARE @WhereString VARCHAR(500)=N'';--条件语句(不用加where)
  DECLARE @PageSize INT;          --每页多少条记录
  DECLARE @PageIndex INT=1;       --指定当前为第几页
  --DECLARE@TotalRecordINTOUTPUT;     --返回总记录数

select top 1
@TableName=[TableName],
@ReFieldsStr=[ReFieldsStr],@OrderString=[OrderString],@WhereString=[WhereString],@PageSize=[PageSize],
@PageIndex=[PageIndex]
from @PageParameter
 DECLARE @StartRecord INT;
 DECLARE @EndRecord INT;
 DECLARE @TotalCountSql NVARCHAR(500); DECLARE @SqlString NVARCHAR(2000); 
 SET @StartRecord=(@PageIndex-1)*@PageSize+1--起始记录
 SET @EndRecord=@StartRecord+@PageSize-1--结尾记录
 SET @TotalCountSql=N'select@TotalRecord=count(*)from'+@TableName;--总记录数语句 
 SET @SqlString=N'(selectrow_number()over(orderby'+@OrderString+') as
rowId,'+@ReFieldsStr+'from'+@TableName;--查询语句

 IF(@WhereString!=''or @WhereString!=null)
   BEGIN
     SET @TotalCountSql=@TotalCountSql+'where'+@WhereString;
     SET @SqlString=@SqlString+'where'+@WhereString;         END

 --第一次执行得到
 EXEC sp_executesql @totalCountSql,N'@TotalRecordintout',@TotalRecord OUTPUT;--返回总记录数 ----执行主语句
 SET @SqlString='select*from'+@SqlString+')astwhererowIdbetween'+
ltrim(str(@StartRecord))+'and'+ltrim(str(@EndRecord));

Exec(@SqlString)  END 
GO
-----调用存储过程
DECLARE @PageParame PageParameter
DECLARE @TotalRecord INT
INSERT INTO @PageParame VALUES('Company','*','Id','',10,2,0)
SELECT * FROM @PageParame
EXEC [dbo].[SP_CustomPagerForTableType] @PageParame,@TotalRecord

 

 
 
posted @ 2023-11-14 09:57  风筝遇上风  阅读(7)  评论(0编辑  收藏  举报