模拟实现SQL Server字段列显示的数据类型




- IF OBJECT_ID(N'[dbo].[ufn_GetDisplayDataTypeName]', 'FN') IS NOT NULL
- BEGIN
- DROP FUNCTION [dbo].[ufn_GetDisplayDataTypeName];
- END
- GO
- --==================================
- -- 功能: 获取字段列显示的数据类型名称
- -- 说明: 支持用户定义类型,可以运行于SQL Server 2005+
- -- 创建: yyyy-MM-dd hh:mm-hh:mm XXX 创建内容描述
- -- 修改: yyyy-MM-dd hh:mm-hh:mm XXX 修改内容描述
- --==================================
- CREATE FUNCTION [dbo].[ufn_GetDisplayDataTypeName]
- (
- @intUserTypeID AS INT -- 用户类型ID
- ,@sntMaxLength AS SMALLINT -- 最大字节长度
- ,@tntPrecision AS TINYINT -- 精度
- ,@tntScale AS TINYINT -- 小数位
- ,@bitIsUpperDisplay AS BIT = 0 -- 是否大写显示(默认小写显示)
- ) RETURNS NVARCHAR(270)
- AS
- BEGIN
- SET @bitIsUpperDisplay = ISNULL(@bitIsUpperDisplay, 0);
- DECLARE
- @nvcDataTypeName AS NVARCHAR(128)
- ,@nvcBaseDataTypeName AS NVARCHAR(128)
- ,@nvcSuffixDisplayName AS NVARCHAR(14)
- SELECT
- @nvcDataTypeName = N''
- ,@nvcBaseDataTypeName = N''
- ,@nvcSuffixDisplayName = N''
- SELECT
- @nvcDataTypeName = [name]
- ,@nvcBaseDataTypeName = (CASE WHEN (@nvcDataTypeName = N'sysname' OR [is_user_defined] = 1) THEN TYPE_NAME([system_type_id]) ELSE @nvcDataTypeName END)
- FROM
- [sys].[types]
- WHERE
- [user_type_id] = @intUserTypeID;
- SET @nvcDataTypeName = (CASE WHEN @nvcDataTypeName <> @nvcBaseDataTypeName THEN @nvcDataTypeName + N':' ELSE N'' END);
- SET @nvcBaseDataTypeName = CASE @bitIsUpperDisplay WHEN 1 THEN UPPER(@nvcBaseDataTypeName) ELSE @nvcBaseDataTypeName END;
- SET @nvcSuffixDisplayName = (CASE
- WHEN @nvcBaseDataTypeName = N'char' THEN QUOTENAME(RTRIM(CAST(@sntMaxLength AS VARCHAR(4))), N')')
- WHEN @nvcBaseDataTypeName = N'varchar' THEN (CASE WHEN @sntMaxLength = -1 THEN N'(MAX)' ELSE QUOTENAME(RTRIM(CAST(@sntMaxLength AS VARCHAR(4))), N')') END)
- WHEN @nvcBaseDataTypeName = N'nchar' THEN QUOTENAME(RTRIM(CAST(@sntMaxLength / 2 AS VARCHAR(4))), N')')
- WHEN @nvcBaseDataTypeName = N'nvarchar' THEN (CASE WHEN @sntMaxLength = -1 THEN N'(MAX)' ELSE QUOTENAME(RTRIM(CAST(@sntMaxLength / 2 AS VARCHAR(4))), N')') END)
- WHEN @nvcBaseDataTypeName = N'binary' THEN QUOTENAME(RTRIM(CAST(@sntMaxLength AS VARCHAR(4))), N')')
- WHEN @nvcBaseDataTypeName = N'varbinary' THEN (CASE WHEN @sntMaxLength = -1 THEN N'(MAX)' ELSE QUOTENAME(RTRIM(CAST(@sntMaxLength / 2 AS VARCHAR(4))), N')') END)
- WHEN @nvcBaseDataTypeName IN (N'numeric', N'decimal') THEN QUOTENAME(RTRIM(CAST(@tntPrecision AS VARCHAR(4))) + N',' + RTRIM(CAST(@tntScale AS VARCHAR(4))), N')')
- WHEN @nvcBaseDataTypeName IN (N'time', N'datetime2', N'datetimeoffset') THEN QUOTENAME(RTRIM(CAST(@tntScale AS VARCHAR(4))), N')')
- ELSE N'' END);
- RETURN @nvcDataTypeName + @nvcBaseDataTypeName + @nvcSuffixDisplayName;
- END
- GO
- CREATE TYPE [dbo].[fd_udt_digest] FROM [NVARCHAR](255) NULL
- GO
- CREATE TYPE [dbo].[fd_udt_id] FROM [CHAR](15) NOT NULL
- GO
- CREATE TYPE [dbo].[fd_udt_username] FROM [NVARCHAR](20) NULL
- GO
- CREATE TYPE [dbo].[UFemail] FROM [VARCHAR](100) NULL
- GO
- CREATE TYPE [dbo].[UFFlag] FROM [CHAR](1) NULL
- GO
- CREATE TYPE [dbo].[UFhyperlink] FROM [VARCHAR](100) NULL
- GO
- CREATE TYPE [dbo].[UFMedia] FROM [IMAGE] NULL
- GO
- CREATE TYPE [dbo].[UFreference] FROM [VARCHAR](30) NULL
- GO
- CREATE TYPE [dbo].[UFtext] FROM [NTEXT] NULL
- GO
- CREATE TYPE [dbo].[UFUID] FROM [UNIQUEIDENTIFIER] NULL
- GO
- CREATE TYPE [dbo].[userdecimal] FROM [DECIMAL](28, 6) NOT NULL
- GO
- CREATE TYPE [dbo].[udtProduct] AS TABLE
- (
- ProductID INT NOT NULL
- ,UnitPrice DECIMAL(9, 2) NOT NULL
- ,Quantity INT NOT NULL
- PRIMARY KEY ([ProductID] ASC)
- )
- GO
- CREATE TABLE [dbo].[ScaleDataTypeTable](
- [ColDecimal] [NUMERIC](18, 2) NULL,
- [ColNumeric] [NUMERIC](9, 2) NULL,
- [ColFloat] [FLOAT] NULL,
- [ColReal] [REAL] NULL,
- [ColTime] [TIME](5) NOT NULL,
- [ColDateTime2] [DATETIME2](3) NULL,
- [ColDateTimeOffset] [DATETIMEOFFSET](5) NULL,
- [ColSqlVariant] [SQL_VARIANT] NULL,
- [ColMoney] [MONEY] NULL,
- [ColSmallMoney] [SMALLMONEY] NULL,
- [Col1] [dbo].[fd_udt_digest] NULL,
- [Col2] [dbo].[fd_udt_id] NULL,
- [Col3] [dbo].[fd_udt_username] NULL,
- [Col4] [dbo].[UFemail] NULL,
- [Col5] [dbo].[UFFlag] NULL,
- [Col6] [dbo].[UFhyperlink] NULL,
- [Col7] [dbo].[UFMedia] NULL,
- [Col8] [dbo].[UFreference] NULL,
- [Col9] [dbo].[UFtext] NULL,
- [Col10] [dbo].[UFUID] NULL,
- [Col11] [dbo].[userdecimal] NULL,
- [Col12] HIERARCHYID NULL,
- [Col13] GEOMETRY NULL,
- [Col14] GEOGRAPHY NOT NULL,
- [Col15] CHAR(10) NOT NULL,
- [Col16] VARCHAR(25) NOT NULL,
- [Col16Max] VARCHAR(MAX) NOT NULL,
- [Col17] NCHAR(16) NOT NULL,
- [Col18] NVARCHAR(32) NOT NULL,
- [Col18Max] NVARCHAR(MAX) NOT NULL,
- [ColBigint] BIGINT NOT NULL,
- [ColInt] INT NOT NULL,
- [ColSmallint] INT NOT NULL,
- [ColTinyint] TINYINT NOT NULL,
- [ColBit] BIT NOT NULL,
- [Col19] DECIMAL(9,7) NOT NULL,
- [Col20] MONEY NOT NULL,
- [Col21] SMALLMONEY NOT NULL,
- [Col22] TIMESTAMP NOT NULL,
- [Col24] UNIQUEIDENTIFIER NOT NULL,
- [Col25] IMAGE NOT NULL,
- [Col26] TEXT NOT NULL,
- [Col27] NTEXT NOT NULL,
- [Col28] BINARY(8) NOT NULL,
- [Col29] VARBINARY(8) NOT NULL,
- [Col29Max] VARBINARY(MAX) NOT NULL,
- [ColMxml] XML NULL,
- [Col30] DATE NOT NULL,
- [Col31] DATETIME NOT NULL,
- [Col32] SMALLDATETIME NOT NULL
- ) ON [PRIMARY];
- GO
- CREATE TABLE [dbo].[UpdateDataTable]
- (
- UpdateDataTableId INT NOT NULL,
- [Col23] ROWVERSION NOT NULL,
- [Colname] sysname NOT NULL
- ) ON [PRIMARY];
- GO
基本数据类型小写展示的效果的T-SQL代码和效果截图如下:
- SELECT
- T2.[name] AS [table_name]
- ,[T1].[name] AS [column_name]
- ,TYPE_NAME([T1].[user_type_id]) AS [column_datatype]
- ,[dbo].[ufn_GetDisplayDataTypeName]([T1].[user_type_id], [T1].[max_length], [T1].[precision], [T1].[scale], 0) AS [column_display_datatype]
- ,[T1].[max_length]
- ,[T1].[precision]
- ,[T1].[scale]
- FROM
- [sys].[all_columns] AS T1
- INNER JOIN [sys].[all_objects] AS T2
- ON [T1].[object_id] = [T2].[object_id]
- WHERE
- [T2].[name] IN (N'ScaleDataTypeTable', N'UpdateDataTable')
- --AND EXISTS (SELECT 1 FROM [sys].[types] WHERE ([name] = N'sysname' OR [is_user_defined] = 1) AND [user_type_id] = [T1].[user_type_id]);
- GO
- SELECT
- T2.[name] AS [table_name]
- ,[T1].[name] AS [column_name]
- ,TYPE_NAME([T1].[user_type_id]) AS [column_datatype]
- ,[dbo].[ufn_GetDisplayDataTypeName]([T1].[user_type_id], [T1].[max_length], [T1].[precision], [T1].[scale], 1) AS [column_display_datatype]
- ,[T1].[max_length]
- ,[T1].[precision]
- ,[T1].[scale]
- FROM
- [sys].[all_columns] AS T1
- INNER JOIN [sys].[all_objects] AS T2
- ON [T1].[object_id] = [T2].[object_id]
- WHERE
- [T2].[name] IN (N'ScaleDataTypeTable', N'UpdateDataTable')
- --AND EXISTS (SELECT 1 FROM [sys].[types] WHERE ([name] = N'sysname' OR [is_user_defined] = 1) AND [user_type_id] = [T1].[user_type_id]);
- GO


模拟实现SQL Server字段列显示的数据类型的更多相关文章
- SQL Server 关于列的权限控制
在SQL SERVER中列权限(Column Permissions)其实真没有什么好说的,但是好多人对这个都不甚了解,已经被人问了几次了,所以还是在这里介绍一下,很多人都会问,我能否单独对表的某列授 ...
- SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理
原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...
- SQL Server 索引列的顺序——真的没关系吗
原文:SQL Server 索引列的顺序--真的没关系吗 翻译自:http://www.mssqltips.com/sqlservertip/2718/sql-server-index-column- ...
- mysql/sql server和java之间的数据类型对应关系
Mysql************************************当前列 ClassName ColumnType DisplaySize TypeName0: java.lang.I ...
- sql server 数据库优化--显示执行计划
刚开始用SQL Server的时候,我没有用显示执行计划来对查询进行分析.我曾经一直认为我递交的SQL查询都是最优的,而忽略了查询性能究竟如何,从而对“执行计划”重视不够.在我职业初期,我只要能获 ...
- 使用sql语句创建修改SQL Server标识列(即自动增长列)
一.标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点:1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统 ...
- SQL Server 一列或多列重复数据的查询,删除(转载)
转载来源:https://www.cnblogs.com/sunxi/p/4572332.html 业务需求 最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库).要求导入 ...
- SQL Server计算列
计算列由可以使用同一表中的其他列的表达式计算得来.表达式可以是非计算列的列名.常量.函数,也可以是用一个或多个运算符连接的上述元素的任意组合.表达式不能为子查询. 例如,在 AdventureWork ...
- SQL Server 字段提取拼音首字母
目前工作中遇到一个情况,需要将SQL Server中的一个字段提取拼音的首字母,字段由汉字.英文.数字以及“-”构成,百度了一堆,找到如下方法,记录一下,以备后用! 首先建立一个函数 --生成拼音首码 ...
随机推荐
- 移动端click时间延迟300
解决移动端click延迟事件方法,,引入fastclick.js 然后在script标签里面写上FastClick.attach(document.body); <!DOCTYPE html& ...
- java基本数据类型
基本数据类型概念 java是一种强类型语言,意味着必须为每一个变量声明一种数据类型. java拥有8中基本数据类型,主要包含如下:4中整形类型(long.int.short.byte)表示整形数值:两 ...
- 多种坐标系之间的转换 Proj.NET和DotSpatial
Proj.NET ( http://projnet.codeplex.com/)是一个.NET下开源的空间参照和投影引擎,遵循OGC相关标准.负责人(Coordinators )是D_Guidi 和S ...
- ABP理论学习之开篇介绍
返回总目录 为了和2016年春节赛跑,完成该系列博客,我牺牲了今天中午的时间来完成该系列的第一篇----开篇介绍.开篇介绍嘛,读过大学教材的同学都知道,这玩意总是那么无聊,跟考试没关系,干脆直接跳过, ...
- 【腾讯Bugly干货分享】WebP原理和Android支持现状介绍
本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/582939577ef9c5b708556b0d 1.背景 目前网络中图片仍然是占 ...
- 自己动手写文件查找,字符串查找,查询jar包等工具
文件查找——搜索当前目录下的文件 知道大概的文件名称,使用 findf FileName findf.py import argparse, re, os from os.path import jo ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC
一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...
- UpdateData(TRUE)与UpdateData(FALSE)的使用
二者是更新对话框的控件与变量. 1.先要建立对应关系 如 编辑框IDC_Edit 和 变量 m_name DDX_Text(pDX, IDC_EDIT, m_name); 2.若是在编辑框输入名字 ...
- Ucos系统任务间的通信详解
物联网开发中,ucos系统任务间的通信是指,两个任务之间有数据的交互,具体的一起来看看吧. 1)消息邮箱 我们还是提供两个任务Task1和Task2,假设我们还是解决刚刚的问题,Task1进行按键扫描 ...
- 浅谈ThinkPHP3.2的子域名部署和路由优化(一)
前言:建立一个网站系统,往往包含多个子网站,例如PC官网,移动端官网,后台管理,数据源自一个相同的数据库,整个架构上,从ThinkPHP来看,可以大体理解为Model(M)是一样的,Controlle ...