十三、自定义类型
用户定义数据类型
通俗定义:用户自己设计并实现的数据类型就称为用户自定义数据类型,即使这些数据类型基于系统数
据类型。也可以理解为基础类型的一个延伸。
用户定义数据类型三要素:
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