在 SQL Server 2008 中,用户定义表类型是指用户所定义的表示表结构定义的类型。您可以使用用户定义表类型为存储过程或函数声明表值参数,或者声明您要在批处理中或在存储过程或函数的主体中使用的表变量。有关如何定义表结构的详细信息,请参阅 CREATE TABLE (Transact-SQL)。

若要创建用户定义表类型,请使用 CREATE TYPE 语句。为了确保用户定义表类型的数据满足特定要求,您可以对用户定义表类型创建唯一约束和主键。

有关与用户定义类型相关联的目录视图的信息,请参阅 sys.types 和 sys.table_types。

限制

用户定义表类型具有下列限制:

  • 用户定义表类型不能用作表中的列或结构化用户定义类型中的字段。
  • 基于用户定义表类型的别名类型
  • [NOT FOR REPLICATION] 选项是不允许的。
  • CHECK 约束要求保留计算列。
  • 计算列的主键必须是 PERSISTED 和 NOT NULL。
  • 无法对用户定义表类型创建非聚集索引,除非该索引是对用户定义表类型创建 PRIMARY KEY 或 UNIQUE 约束的结果。(SQL Server 使用索引强制实施任何 UNIQUE 或 PRIMARY KEY 约束。)
  • 不能在用户定义表类型的定义中指定 DEFAULT 值。
  • 在创建用户定义表类型定义后不能对其进行修改。
  • 不能在用户定义表类型的计算列的定义中调用用户定义函数。

安全性

用户定义表类型的权限通过使用下列 Transact-SQL 关键字来遵循 SQL Server 的对象安全模式:CREATE、GRANT、DENY、ALTER、CONTROL、TAKE OWNERSHIP、REFERENCES、EXECUTE、VIEW DEFINITION 和 REVOKE。

下面我用一个实例来讲解一下

-- ================================
-- 创建和使用自定义表类型
-- 陈希章
-- ================================

USE master
GO
-- ================================
-- 创建测试数据库
-- ================================
CREATE DATABASE demo
GO

-- ================================
-- 创建一个表
-- ================================
USE demo
GO

CREATE TABLE Customers
(
    Id int NOT NULL,
    Name char(10) NULL,
    PRIMARY KEY (Id)
)
GO

USE demo
GO
-- ================================
-- 创建自定义表类型
-- ================================
CREATE TYPE dbo.CustomerTable AS TABLE
(
    Id int NOT NULL,
    Name char(10) NULL,
    PRIMARY KEY (Id)
)
GO

-- =================================
-- 直接使用自定义表类型
-- =================================
DECLARE @c CustomerTable
INSERT INTO @c VALUES(1,'Xizhang')
SELECT * FROM @c

-- =================================
-- 在存储过程中使用自定义表类型
-- =================================
CREATE PROC GetCustomers
(@c CustomerTable READONLY)
AS
INSERT Customers SELECT * FROM @c --将传过来的参数(其实是一个表)的数据插入到Customers表里面去

-- =================================
-- 调用该存储过程,一次性插入4行数据
-- =================================
DECLARE @temp CustomerTable
INSERT INTO @temp VALUES(7,'Xizhang')
INSERT INTO @temp VALUES(2,'Xizhang')
INSERT INTO @temp VALUES(3,'Xizhang')
INSERT INTO @temp VALUES(4,'Xizhang')
EXEC GetCustomers @c=@temp
SELECT * FROM Customers

-- =================================
-- 清理数据库
-- =================================
USE master
GO

DROP DATABASE demo
GO

看起来不错对吧,但是你应该马上想到一个问题,如果说这个存储过程要在客户端代码中调用,那么该怎么提供这个参数值呢?

using System.Data.SqlClient;
using System.Data;

class Program
{
    static void Main(string[] args)
    {
        DataTable tb = GetData();
        using (SqlConnection conn = new SqlConnection("server=sql2008;database=demo;integrated security=true"))
        {
            using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = "GetCustomers";
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter param = new SqlParameter("@c", SqlDbType.Structured);//这个类型很关键
                param.Value = tb;
                cmd.Parameters.Add(param);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
            }
        }

Console.WriteLine("完成操作");
        Console.Read();
    }

private static DataTable GetData()
    {
        DataTable tb = new DataTable();
        tb.Columns.Add("Id",typeof(int));
        tb.Columns.Add("Name", typeof(string));

//添加100个客户资料
        for (int i = 0; i < 100; i++)
        {
            DataRow row = tb.NewRow();
            row[0] = i;
            row[1] = "Name " + i.ToString();
            tb.Rows.Add(row);
        }

return tb;
    }
}

读者可能会疑惑,这样做实在是太棒了,可以一次性写入100行数据呢?我们再来看看在服务端到底发生了什么事情

实际上,在服务端确实会有一个定义临时变量的过程,然后把所有的数据插入到这个变量中去,然后再执行存储过程的

最后,我们可以再深入探讨探讨

1. 客户端是否一定用DataTable类型

-- 推荐使用DataTable类型,但也可以使用其他的类型,例如DataReader的数据流

2. DataTable的字段名称是否要匹配

--不一定。只要顺序一致,类型一样就可以了。

有一个参考的blog,请看下面的链接

http://msdn.microsoft.com/zh-cn/library/bb675163.aspx

转载于:https://www.cnblogs.com/jhxk/articles/2915476.html

使用自定义表类型(SQL Server 2008)相关推荐

  1. win2008 mysql端口_使用自定义端口连接SQL Server 2008的方法

    使用过SQL Server的人大多都知道,SQL Server服务器默认监听的端口号是1433,但是我今天遇到的问题是我的机器上有三个数据库实例,这样使用TCP/IP远程连接时就产生了问题.如何在Mi ...

  2. PowerDesigner16建表在SQL SERVER 2008报 对象名 'sysproperties' 无效。

    http://blog.itpub.net/30150152/viewspace-1454979/

  3. SQL Server 2005与SQL Server 2008 的区别

    随时随地管理您的数据 SQL Server 2008 在 Microsoft 的数据平台上发布,帮助您的组织随时随地管理任何数据.它可以将结构化.半结构化和非结构化文档的数据(例如图像和音乐)直接存储 ...

  4. 安装 SQL Server 2008 R2 的硬件和软件要求(转)

    以下各部分列出了安装和运行 SQL Server 2008 R2 的最低硬件和软件要求.有关 SharePoint 集成模式下的 Analysis Services 的要求的详细信息,请参阅硬件和软件 ...

  5. SQL Server 2008 的版本和组件

    根据应用程序的需要,安装要求会有所不同. 不同版本的 SQL Server 能够满足单位和个人独特的性能.运行时以及价格要求. 安装哪些 SQL Server 组件还取决于您的具体需要. 下面的部分将 ...

  6. SQL Server 2008 Datetime Cast 成 Date 类型可以使用索引(转载)

    很久没写blog,不是懒,实在是最近我这的访问速度不好,用firefox经常上传不了图片 ....... 今天无意发现了SQL Server 2008 Datetime Cast 成 Date 类型可 ...

  7. SQL Server 2008从基础开始学习的历程(1)------创建表与查询

    [by:yy] 无论我们学什么呢,都要讲究一个Why,一个How.那么我们为什么要学SQL呢?无非就那么几点. 1.为了适应其他技术,和其他技术配对而学. 我个人的理解呢,只要在IT行业,无论你学什么 ...

  8. SQL SERVER 2008不能修改表的解决方法(增加字段、修改字段名)(未解决)

    SQL SERVER 2008不能修改表的解决方法(增加字段.修改字段名)(未解决) 参考文章: (1)SQL SERVER 2008不能修改表的解决方法(增加字段.修改字段名)(未解决) (2)ht ...

  9. 如何解决SQL Server 2008 R2中“阻止保存要求重新创建表的更改”的问题!

    今天在讲解SQL Server 2008  R2课程中,有学生遇到一个问题,在SQL Server 2008  R2管理控制台中创建一个新表后,如果再次打开该表进行修改保存时,发现对每个表的修改都不成 ...

最新文章

  1. 变频器怎么设置_如何利用串口调试软件与变频器通信?
  2. String对象的intern()
  3. rest_framework05:GenericAPIView用法/扩展类5个/子类9个/ViewSetMixin 自定义方法名字
  4. 开发日志_Jan.8.2017
  5. mysql通过集合查询_MySQL使用集合函数进行查询操作实例详解
  6. 爬虫-10-响应对象的常用属性
  7. 【ElasticSearch】ElasticSearch 中使用衰减函数来完美你的搜索结果
  8. Spring Boot学习总结(14)——Spring Boot常见面试题汇总
  9. 计算机考研专业综合考试二,2015计算机考研大纲:专业基础综合考试大纲原文(2)...
  10. is_callable_Python callable()和__call __()
  11. 非法使用java_java中的非法远程方法
  12. [机器学习入门笔记] 2. 2022吴恩达机器学习Deeplearning.ai课程(回顾)
  13. 分数换算小数补0法_小学数学常用公式大全(单位换算表),替孩子收藏一份...
  14. 终南山--SpringBoot系列之Spring Data Jpa连表查询和分页
  15. java字符串流与管道流
  16. 分支过程灭绝概率matlab,某类遗传环境下的两性分支过程:有关伴Y基因的灭绝概率问题...
  17. 【扩展欧几里得】Codeforces Round #406 (Div. 2) A. The Monster
  18. 【深度学习】深度学习中模型计算量(FLOPs)和参数量(Params)等的理解以及四种在python应用的计算方法总结
  19. L2-026 小字辈——BFS DFS 并查集-三种方法
  20. 饼图中显示百分比方法

热门文章

  1. 重学java基础第九课:软件和软件关系
  2. 前端学习(3301):类组件的ref
  3. [html] HTML5如何播放ts视频流?
  4. [vue] vue如何监听键盘事件?
  5. [css] 写出在不固定宽高的元素在固定高度的情况下水平垂直居中的方法
  6. 工作305:对选择的数值清空
  7. 前端学习(2655):vue2中用ref实现计算器
  8. 前端学习(1988)vue之电商管理系统电商系统之获取商品列表
  9. 前端学习(1424):ajax低版本兼容问题
  10. 前端学习(571):margin负值下的两栏自适应