使用自定义表类型(SQL Server 2008)

在 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行数据呢?我们再来看看在服务端到底发生了什么事情

image

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

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

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html select不能修改,更改HTML Select元素的选定选项

香草JavaScript使用普通的旧JavaScript&#xff1a;var val "Fish";var sel document.getElementById(sel);document.getElementById(btn).onclick function() {var opts sel.options;for (var opt, j 0; opt opts[j]; j) {if (opt.value val) {sel.selectedI…

用excel打开文本内容

linux中直接从数据库导出数据存为txt文本&#xff0c;用文本编辑器打开是这样的&#xff0c;不适合统计数据&#xff0c;转成excel就万事大吉了,这点事微软怎么会想不到呢直接上图&#xff1a;every thing goes well!! :-)来自为知笔记(Wiz)转载于:https://www.cnblogs.com/fir…

html框架有什么作用,使用HTML5+CSS+JS框架有那些好处

使用HTML5CSSJS框架有那些好处2017-12-08相信很多程序猿朋友都用过框架&#xff0c;不过你是否知道你用的是HTML框架、CSS框架还是JS框架&#xff0c;其实这都不重要&#xff0c;重要的是使用框架的目的是什么&#xff1f;是不是节约了开发项目时间陈本&#xff0c;这事多么伟大…

SharePoint【学习笔记】-- SharePoint 2010 技术参数整理

今天整理一些 SharePoint 2010 的技术参数&#xff0c;其内容都来自 SharePoint-Sandbox 网站。 有些参数值是硬性的&#xff0c;比如列表单条记录的尺寸&#xff1b;而有些是为了使用和性能考虑的推荐值。 技术参数值列表最大记录数500万条列表单条记录上限8KB&#xff08;不含…

目前微型计算机中常用的鼠标器有什么两类,2009年计算机一级考试真题及答案...

2009年计算机一级考试真题及答案。一、选择题1、在计算机领域中通常用M IPS来描述______。A、计算机的运算速度B、计算机的可靠性C、计算机的可运行性D、计算机的可扩充性2、微型计算机存储系统中&#xff0c;PROM是______。A、可读写存储器B、动态随机存取存储器C、只读存储器…

当某个快捷键不能用时很可能是热键冲突

解决办法&#xff1a;上次我的复制 ctrl c不能用就是打开的QQ系统设置&#xff0c;只保留qq的截图快捷键&#xff0c;其他的都是无。 哎&#xff0c;一会又热键冲突了&#xff0c;卸载了搜狗输入法就没事了&#xff0c;原来搜狗的问题。转载于:https://www.cnblogs.com/xiaofa…

用HTML写一首绝句古诗,《绝句二首》_杜甫的诗词_诗词名句网

作品赏析迟日江山丽&#xff0c;春风花草香。泥融飞燕子&#xff0c;沙暖睡鸳鸯。清代的诗论家陶虞开在《说杜》一书中指出&#xff0c;杜集中有不少“以诗为画”的作品。这一首写于成都草堂的五言绝句&#xff0c;就是极富诗情画意的佳作。诗一开始&#xff0c;就从大处着墨&a…

计算机组装与维护配置清单作业,计算机组装与维护 作业汇.doc

计算机组装与维护 作业汇计算机组装与维护学院&#xff1a;信息工程与自动化学院专业&#xff1a;测控技术与仪器级别&#xff1a;2011级姓名&#xff1a;学号&#xff1a;&#xff0e;三篇测评&#xff0c;100个名词解释一&#xff0e;电脑测评地址&#xff1a; HYPERLINK /do…

html+dom能做什么,jQuery能做什么?

jQuery是一个简洁而快速的JavaScript库&#xff0c;可用于简化事件处理&#xff0c;HTML文档遍历&#xff0c;Ajax交互和动画&#xff0c;以便快速开发网站。目的是让开发者更容易地在网站上使用JavaScript。它不是一种单独的编程语言&#xff0c;与JavaScript一起工作。使用jQ…

9个常用iptables配置实例

iptables命令可用于配置Linux的包过滤规则&#xff0c;常用于实现防火墙、NAT。咋一看iptables的配置很复杂&#xff0c;掌握规律后&#xff0c;其实用iptables完成指定任务并不难&#xff0c;下面我们通过具体实例&#xff0c;学习iptables的详细用法。 1.删除已有规则 在新设…

中国微型计算机分省市产量数据统计,2017年6月中国微型计算机设备产量统计数据分析...

根据三胜产业研究中心数据&#xff0c;2017年1-6月全国微型计算机设备产量统计显示&#xff1a;2017年6月全国微型计算机设备产量为2896.88万部&#xff0c;当月同比增速18.9%&#xff1b;2017年1-6月全国微型计算机设备产量累计为14145.57万部&#xff0c;累计同比增速5%。图表…

javascript-04 引用类型

引用类型是一种数据结构&#xff0c;用于将数据和功能组织在一起&#xff0c;是一个对象 Object类型var obj new Object(); var obj {name: "xiaoming", age: 15}; 一般访问采用 alert(obj.name) Array类型数组 var arr new Array(n); n个项的数组 var arr new A…

html JSP 富文本案例,JSP页面引入Ueditor富文本编辑器!

最近做项目时&#xff0c;需要用到富文本编辑器&#xff0c;使用了百度的Ueditor编辑器&#xff0c;因此 在这和大家分享下工具/原料myeclipse,ueditor方法/步骤从官网上 地开级还思层似未屏别。域一插式近址发应是http://ueditor.baidu.com/website/download.h分浏代刚的学过互…

认识委托和事件

最近在自定义控件中做了个DropDownList的联动事件&#xff0c;具体的要求就是选择起始日期的年、月份和截止日期年、月份保持一样&#xff0c;避免起始日期大于截止日期。 --------------------------------分割线---------------------------------------- 首先就要明白以下几…

上海2014计算机职称考试理论题,2014年上海市高校计算机一级考试8套理论题含答案...

2014年上海市高校计算机一级考试8套真题的理论题含参考答案,供学生复习迎考,是最新的上海计算机一级理论题复习提纲。A.光纤接入 B.CableModem C.ADSL D.电话拨号18. 关于防火墙&#xff0c;下列描述正确的是________。A.防火墙主要是为了查杀内部网中的病毒B.防火墙可将未被授…