sql server linux性能,详细了解SQL Server 2008性能和性能优化

在SQL Server 2005或更早的版本中的中,表变量是不能作为存储过程的参数的。当多行数据到SQL Server需要发送多行数据到SQL Server ,开发者要么每次发送一列记录,或想出其他的变通方法,以满足需求。虽然在.net 2.0中提供了个SQLBulkCopy对象能够将多个数据行一次性传送给SQL Server,但是多行数据仍然无法一次性传给存储过程。

SQL Server 2008中的T-SQL功能新增了表值参数。利用这个新增特性,我们可以很方便地通过T-SQL语句,或者通过一个应用,将一个表作为参数传给存储过程。

1、用户自定义表类型

当第一次看看新的表值参数,我认为使用此功能有点复杂。有几个步骤。要做的第一件事是定义表型。在Management Studio 2008中的“Programmability”“Type”节点,您可以看到“User-Defined Table Types(用户自定义表类型)”,如图1所示 。

0vmk44ghc780.jpg

图 1:用户自定义表类型

点击右键,在弹出菜单中选择“新用户定义的表型... ” ,会新建一个模板中的查询窗口,如图2所示 。

kfw9070ujh9o.jpg

图2:用户自定义表类型创建语句

点击“Specify Values for Template Parameters(指定值为模板参数)”按钮,将探出一个对话框,如图3所示。

86459klhsis7.jpg

图 3:指定模板参数列的数值

在填写在适当的数值之后,点击确定按钮,一个“CREATE TYPE”的声明取代了范本。这时,你也可以手动增加一些列,或者增加一些限制条件,最后点击确定按钮。

以下是最终的代码:

-- ================================

-- Create User-defined Table Type

-- ================================

USE Test

GO

-- Create the data type

CREATE TYPE dbo.MyType AS TABLE

(

col1 int NOT NULL,

col2 varchar(20) NULL,

col3 datetime NULL,

PRIMARY KEY (col1)

)

GO

在运行代码之后,对象的定义就建立好了,你可以在“User-Defined Table Type(用户自定义表类型”中查看属性,如图4所示,但没法修改它们。如果要修改的类型,你只能将其删除,然后按照修改后的属性再次创建它。

r30ia99ekrks.jpg

图4:查看用户自定义表类型的属性

2、使用用户自定义的表类型

如果打算在T-SQL代码中使用,您还必须创建一个新类型的变量,然后将具体的表的名称赋值给该变量。一旦赋值后,您可以在其他的T-SQL语句中使用它。因为它是一个变量,在批处理完成后,它也自动失效,结束生命周期。

请注意下面的代码,MyType是我们之前刚刚创建的数据类型。

DECLARE @MyTable MyType

INSERT INTO @MyTable(col1,col2,col3)

VALUES (1,'abc','1/1/2000'),

(2,'def','1/1/2001'),

(3,'ghi','1/1/2002'),

(4,'jkl','1/1/2003'),

(5,'mno','1/1/2004')

SELECT * FROM @MyTable

在变量的有效范围内,你可以象操作正常的表一样来操作这个变量,如与另一个表象关联或者将变量中的记录填充到另一个表。对于表变量来说,你无法修改表定义。

正如前面提到的,变量不能超出它的有效的范围。如果T-SQL脚本由多个批处理组成,变量只有在批处理内才能创建并有效使用。

3、使用变量作为参数

到目前为止,我们还没有看到经常表变量无法实现的功能。其好处是能够将变量作为参数传给存储过程。当然一个存储过程必须先建立,使用新的类型作为其中的一个参数。

下面这个例子,通过代码创建一个常规表,并对其填充记录。

USE [Test]

GO

CREATE TABLE [dbo].[MyTable] (

[col1] [int] NOT NULL PRIMARY KEY,

[col2] [varchar](20) NULL,

[col3] [datetime] NULL,

[UserID] [varchar] (20) NOT NULL

)

GO

CREATE PROC usp_AddRowsToMyTable @MyTableParam MyType READONLY,

@UserID varchar(20) AS

INSERT INTO MyTable([col1],[col2],[col3],[UserID])

SELECT [col1],[col2],[col3],@UserID

FROM @MyTableParam

GO

请注意表值参数后面带了个READONLY参数。这是必需的,不能在例程体中对表值参数执行诸如 UPDATE、DELETE 或 INSERT 这样的 DML 操作。

最后,我们对创建表值变量,对变量进行赋值,并调用存储过程。

DECLARE @MyTable MyType

INSERT INTO @MyTable(col1,col2,col3)

VALUES (1,'abc','1/1/2000'),

(2,'def','1/1/2001'),

(3,'ghi','1/1/2002'),

(4,'jkl','1/1/2003'),

(5,'mno','1/1/2004')

EXEC usp_AddRowsToMyTable @MyTableParam = @MyTable, @UserID = 'Kathi'

SELECT * FROM MyTable

为了让用户使用自定义表类型,执行或控制权限必须是理所当然的。以下是授权命令:

GRANT EXECUTE ON TYPE::dbo.MyType TO TestUser;

4、通过.net应用程序调用

表值参数这一特性最大的亮点在于可以在.net应用中使用表值参数。为了做到这一点,你必须要先安装.NET 3.5框架,并确保应用程序中已经引用了 System.Data.SqlClient命名空间。创建表值参数时需要用到一些新的SQL数据类型(如DataTable、DataColumn等)。

首先创建一个本地数据表,并插入一些记录。肯定的是, DataTable中创建符合用户定义的表型的列计数和数据类型。

'Create a local table

Dim table As New DataTable("temp")

Dim col1 As New DataColumn("col1", System.Type.GetType("System.Int32"))

Dim col2 As New DataColumn("col2", System.Type.GetType("System.String"))

Dim col3 As New DataColumn("col3", System.Type.GetType("System.DateTime"))

table.Columns.Add(col1)

table.Columns.Add(col2)

table.Columns.Add(col3)

'Populate the table

For i As Integer = 20 To 30

Dim vals(2) As Object

vals(0) = i

vals(1) = Chr(i + 90)

vals(2) = System.DateTime.Now

table.Rows.Add(vals)

Next

我们在代码中采用存储过程:创建一个命令对象,并新增两个参数。代码如下图所示:

'Create a command object that calls the stored proc

Dim command As New SqlCommand("usp_AddRowsToMyTable", conn)

command.CommandType = CommandType.StoredProcedure

'Create a parameter using the new type

Dim param As SqlParameter = command.Parameters.Add

("@MyTableParam", SqlDbType.Structured)

command.Parameters.AddWithValue("@UserID", "Kathi")

请注意@ MyTableParam参数的数据类型(SqlDbType.Structured),这是.Net 3.5中新增的功能。最后,将当地表赋值给表值参数,并执行该命令。

'Set the value of the parameter

param.Value = table

'Execute the query

command.ExecuteNonQuery()

5、小结

SQL Server 2008中新增的表值参数特性,减少了应用程序与SQL Server服务器之间的交互,提升了程序性能。

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

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

相关文章

开发linux显卡驱动,显卡驱动开发DRM入门--Apple的学习笔记

由于之前的blog提及kmscube的源码我没有找到,所以只能在网上搜索了。DRM简介DRM是Linux目前主流的图形显示框架,同时DRM可以统一管理GPU和Display驱动,使得软件架构更为统一,方便管理和维护。而且drm是集成在linux kernel中的。DR…

linux 中w和x 区别,r、w、x权限在文件和目录中的含义有何区别?

age 于 2011-01-11 17:48:39发表:目录和文件的rw权限基本一致, 唯一有区别的可能就是执行权限了文件的可执行权限很好理解, 最简单的理解就是可以在终端下输入路径来执行这个文件.但目录可执行的意思则完全不同, 它并非指这个目录可以被执行. 而是指它允许在该目录下运行可执行…

linux ppp漏洞,Linux下ppp拨号的实现(Arm)

Linux发行版自带PPP拨号需要的pppd和chat命令,以2.6.18内核的Linux虚拟机为例,在/usr/sbin目录下,/etc/ppp目录也已自动创建。参考模权创建拨号脚本ppp-on,ppp-off,ppp-on-dialer三个文件,on&off放在/u…

c语言学生成绩管理论文,学生成绩管理系统毕业论文c语言.doc

111111111学院毕 业 论 文题 目 学生成绩管理系统姓 名 1 1 1所在系别 计 算 机 系专业班级 计算机应用技术计算机111班学 号 1111111111指导教师 1 1 1日 期 2012 年 4 月 15 日目 录摘 要 ………………………………………………………………………………………………………1…

编程语言基础 c语言同步教案,C语言程序设计基实验教案.doc

C语言程序设计基实验教案高级语言程序设计基础实验主讲教师:张顺利2011年10月,其中。2.将China译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母A后面第四个字母是E,用…

c语言char转cstring,CString、TCHAR*、char*转换 | 时刻需

char*、TCHAR*转换CStringCString str(****)下面详细写一下其它转换///************************************************************************* 函数: TransCStringToTCHAR* 描述:将CString 转换为 TCHAR** 日期:*********************…

c语言的c语句ab2,当初我在重庆交通大学读书的时候C语言成绩也相当不错的

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼楼主,感激不尽。1、C语言数组下标默认从 ______开始。2、C语言全局变量的存储值类型可以是exlern和_______3、结构化程序设计的三种基本结构分别指的是顺序结构、_____和_____4、若有定义imb2,c0执行下面的表…

android mvc使用方法,详细学习android mvc设计模式教程

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 web 应用程序的模式。其分层有助于管理复杂的应用程序,因为可以在一个时间内专门关注一个方面。例如,可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易…

android l 电池,DIY新技能--M1L换电池

DIY新技能--M1L换电池2019-10-23 16:48:526点赞6收藏10评论更换理由M1L是好几年前买的了,具体几年前我都懒得购买记录了。前前后后买了4台锤子手机了,这是我支持老罗的第二款手机,前一款是坚果手机,买了两台早先给妈妈用一台后来给…

android版本10好不好,一加正式推送Android 10系统 流畅性怎么样

近日,一加正式推送Android 10系统,不知道流畅性如何呢?一加官方推特正式宣布Android 10系统已进行阶段性推送,从今天开始一加7和一加7 Pro手机用户将会陆续收到氧OS系统的更新,国内基于Android 10的氢OS将于下月推送。…

android 移除fragment,Android Viewpager+Fragment取消预加载及Fragment方法的学习

1.在使用ViewPager嵌套Fragment的时候,由于VIewPager的几个Adapter的设置来说,都会有一定的预加载。通过设置setOffscreenPageLimit(int number) 来设置预加载的熟练,在V4包中,默认的预加载是1,即使你设置为0&#xff…

r语言 html表格,R语言table()函数

R语言table()函数比较有用,两个示例尤其是混淆矩阵这个案例比较有用:例子一:统计频次zz1#实现z中各数据频次的统计z1 2 4 73 3 1 1names(z1)#居然是有名字的[1] "1" "2" "4" "7"例子二:实…

android屏幕适配流程,Android屏幕适配姿势

GitHub地址为什么要屏幕适配?device_framentation.png统计碎片化品牌机型碎片化屏幕尺寸碎片化操作系统碎片化为了保证用户获得一致的用户体验效果,使得某一元素在Android不同尺寸、不同分辨率的手机上具备相同的显示效果,则需要我们进行屏幕…

在html中写js提示错误,页面HTML标签优化

真正需要SEOer掌握并经常使用的HTML标签也就那么几个,本小节错误君带来的是页面HTML标签优化。title标签 – 标题标签1)title标签用法2.13 TF-IDF加权方法 – 错误教程2)标题标签的作用文章标题有着关键词的作用,文章标题引点击流量。3)页面标题标签优化…

在线聊天室html5源码,HTML5WebSocket实现聊天室的代码示例

本篇文章主要介绍了HTML5-WebSocket实现聊天室示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。在传统的网页实现聊天室的方法是通过每隔一段时间请求服务器获取相关聊天信息来实现,然而html5带来的websocket功能改变这了这种方式&am…

android人脸情绪识别器,基于Android平台的人脸表情识别系统的设计与实现

摘要:随着目前移动设备硬件技术的不断发展,其性能与PC的差距越来越小,这使得在嵌入式平台上进行图像处理成为了可能.目前使用最广泛的是基于Android系统的嵌入式平台,与之相关的图像类应用需求也渐渐增多,如图片文字识别,人脸识别等等.而近年来,人脸表情识别技术成为…

android删除键监听,「React Native」Android返回键监听

在需要做监听的js中添加componentWillMount() {if (Platform.OS android) {BackHandler.addEventListener(hardwareBackPress, this.onBackHandler);}}componentWillUnmount() {if (Platform.OS android) {BackHandler.removeEventListener(hardwareBackPress, this.onBackHa…

列表页时间日期标签靠显示html,帝国CMS列表页面list.var分别调用年月日,显示个性时间日期...

在帝国CMS中列表页个性时间显示的实现方式,首先我们要知道用什么方法来实现,这里我们使用PHP代码来做。要在模板代码中使用PHP代码,就必须勾选此模板代码页面的-使用程序代码.位置就在添加模板页面的列表内容模板(list.var) (*)上边。然后我们在list.var…

html鼠标响应事件吗,学习JavaScript鼠标响应事件

本文为大家分享了一个简单的鼠标模拟案例,供大家参考,具体实现内容如下如何实现捕抓鼠标事件,当鼠标滑动时,获取当前鼠标的坐标,接着在一个透明区域里绑定捕抓的位移,这样就能在模拟的透明区域里实现鼠标滑…

html5边框闪烁,HTML – CSS框阴影动画像素艺术闪烁

部分用于测试,部分用于我的设计理念,我试图将动画gif转换为纯动画CSS.它几乎正常工作,但我遇到了障碍,我不确定是什么导致了我的问题,或者我如何解决它.我不幸地怀疑我只是限制了技术.至于实际的CSS,我一直在尝试实现这里的方法(动画框阴影属性),因为它看起来最可行&#xff1a…