
SqlServer2008实例
取材于《SQL Server 2008实战》,Joseph Sack著,金迎春译。只是个学习笔记,把书中的代码在键盘上敲一遍。
ngbshzhn
数学教师一枚
展开
-
SqlServer2008实例58UDF之维护可重用的代码
标量UDF可以把逻辑封装到一个函数中,而不是在每次需要的时候多次重复逻辑,从而减少代码膨胀。 例如,下面的标量用户定义函数用于决定雇员可以拿到的电脑类型。有好几行代码来计算不同的输入参数,包括雇员的头衔、雇员的雇用日期以及是否领薪水.可以将这些逻辑封装到一个函数中,而不是在数据库中的多个地方重复这段逻辑:USE AdventureWorksGOCREATE FUNCTION dbo.udf_GET_AssignedEquipment(@Title nvarchar(50),@H...原创 2020-09-04 09:07:41 · 128 阅读 · 1 评论 -
SqlServer2008实例58查看UDF元数据,移除用户定义函数
1.查看当前数据库中的UDF列表SELECT name,type_desc,definitionFROM sys.sql_modules sINNER JOIN sys.objects o ON s.object_id=o.object_idWHERE TYPE IN('IF','TF','FN')--IF为内联表UDF,TF为多语句表UDF,FN为标量UDF sys.sql_modules和sys.objects系统视图用来在查询的结果集中返回UDF名、类型描述以及SQL定义。2..原创 2020-08-23 08:03:28 · 166 阅读 · 0 评论 -
SqlServer2008实例57修改用户定义函数
使用ALTER FUNCTION命令能修改函数,USE AdventureWorksGO--创建一个把字符数组作为结果集返回UDFALTER FUNCTION dbo.udf_ParseArray(@StringArray varchar(max), @Delimiter char(1), @MinRowSelect int, @MaxRowSelect int )RETURNS @StringArrayTable Table (RowNum int IDENTITY(1,...原创 2020-08-23 07:52:34 · 155 阅读 · 1 评论 -
SqlServer2008实例56创建多语句用户定义函数
多语句表UDF能像内联UDF一样在FROM子句中被引用,但是和内联UDF不同的是,它们不限制在函数定义内只能使用·一个SELECT语句。多语句UDF能在UDF定义的主体内使用多个T-SQL语句以定义最后要返回的一个结果集。 多语句表UDF的基本语法如下:CREATE FUNCTION [ schema_name. ] function_name( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_typ...原创 2020-08-19 09:21:54 · 177 阅读 · 0 评论 -
SqlServer2008实例55创建内联用户定义函数
内联UDF返回表数据类型。在UDF定义中,你不需要显式定义返回的表,只需要使用一个SELECT语句来定义返回的行和列。内联UDF使用一个或多个参数并使用一个SELECT语句返回数据。内联UDF和视图非常相似,它们能在FROM子句中引用。然而和视图不同的是,UDF可以接受参数,然后将它们用在函数的SELECT语句中。 基本语法如下:CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parame...原创 2020-08-19 08:58:13 · 136 阅读 · 0 评论 -
SqlServer2008实例54创建标量用户定义函数
T-SQL用户定义函数(UDF)分成3类:标量(scalar)、内联表值(inline tablehvalued)和多语句表值(multi-statement table valued). 标量用户定义函数用于根据0个或多个参数返回一个值。例如,你可以创建一个接受CountryID作为参数的标量UDF,并返回CountryNM。 如果在SELECT子句中使用标量用户定义函数,函数将为FROM子句中每一行执行,根据函数的设计情况,这样很可能会造成很差的性能. 内联表值UDF...原创 2020-08-18 10:16:29 · 358 阅读 · 0 评论 -
SqlServer2008实例53重新编译和缓存
1.每次存储过程执行时重新编译 当存储过程的计划自动或显式重建的时候就会发生重新编译。当存储过程中引用的基础表或其他对象发生改变后,存储过程就会在其执行期间自动重新编译。计划使用的索引发生变动或者存储过程引用的表键发生了大量的更新也可能引起重新编译。自动重新编译的目的足确保SQL Servcr执行计划使用最新的信息,不使用过期的假设架构和数据。 SQL Server在存储过程中使用语句级别的重新编译,而不是重新编译整个存储过程。重新编译在生成新计划的时候会引起额外的负载,而语句级别的重新编...原创 2020-08-15 09:17:38 · 247 阅读 · 0 评论 -
SqlServer2008实例52存储过程安全
1.加密存储过程 存储过程的T-SQL定义能在数据库中实现内容加密,这样就不能读取过程的定义。在后端使用SQL Server的软件开发商通常加密存储过程来防止客户端或竞争对手的篡改或逆向工程。如果你使用了加密,请确保保存了原始的T-SQL定义,因为以后不能再轻易地解密它(合法并且可靠的)。而且应该只在正式把它部署到生产环境之前才进行加密。 要加密存储过程,可以在新存储过程的名字后面指定WITH ENCRYPTION:USE AdventureWorksGOCREATE PROC...原创 2020-08-15 08:48:30 · 246 阅读 · 0 评论 -
SqlServer2008实例51存储过程基础
目录1.创建基本的存储过程2.创建带参数的存储过程3.使用OUTPUT参数4.修改存储过程5.删除存储过程6.在SQL Server启动时自动执行存储过程7.报告存储过程元数据8.为存储过程建立文档用存储过程有以下一些好处。存储过程帮助在数据层聚集T-SQL代码。嵌入即席SQL的网站或应用程序在应用环境下很难修改,当即席SQL嵌入在应用程序内的时候,你可能会花费太多时间试图找到和调试嵌入的SQL。一旦找到了bug,你可能就需要重新编译可执行程序,引起不必要的应用程序临原创 2020-08-11 09:41:40 · 357 阅读 · 0 评论 -
SqlServer2008实例50游标
有编程背景的查询编写者通常更习惯于使用游标,而不是基于集合的方案来获取或更新行。例如,程序员可能会决定一次遍历一行,一条一条地更新行,而不是用一个操作来更新整个行集。但是,游标会耗尽SQL Server实例的内存、减少并发性、减少网络带宽、锁定资源,并且经常会需要比基于集合的方案更多的代码。T-SQL是基于集合的语言,也就是说它擅长操作和获取行集,而不是一行一行地处理。 然而,应用程序或业务需求可能需要T-SQL游标提供的一行一行的处理方式。通常,应该在其他诸如WHILE循环、子查询、临时表...原创 2020-08-10 10:04:14 · 295 阅读 · 1 评论 -
SqlServer2008实例49流控制
目录1.使用RETURN2.使用WHILE3.使用GOTO4.使用WAITFOR1.使用RETURN RETURN用来立即退出当前的T-SQL批处理、查询或存储过程,并且不执行它之后的批处理/查询/过程域中的任何代码。RETURN仅退出当前域中执行的代码。如果在存储过程A中调用了存储过程B,并且存储过程B发起一个RETURN,那么存储过程B会立即终止,但是存储过程A还会继续,就好像B已经成功完成。 示例1:使用RETURN来无条件终止一个查询:USE Adv...原创 2020-08-10 09:27:13 · 139 阅读 · 0 评论 -
SqlServer2008实例48条件处理
条件处理可以根据一个或者一组表达式的值来返同结果。 CASE函数用于根据一个表达式的值返回结果。它常用于将代码转换为描述性的值或者计算多个条件来返回一个值(例如,“如果行是2008年的并且小于或等于当前的季度,则返回销售总数”)。 IF…ELSE结构计算一个布尔表达式,如果足TRUE则执行一个T-SQL语句或批处理。这个命令有很多用途,使用它可以根据条件返回结果集、更新数据或根据一个或多个搜索条件执行存储过程。1.使用CASE来计算单个输入表达式 CASE函数用于根据一个...原创 2020-08-09 10:13:07 · 214 阅读 · 0 评论 -
SqlServer2008实例47IDENTITY和uniqueidentifier函数
IDENTITY列属性定义在表的某个列上,并且允许我们为表中的一个列定义自增的数字值。 和确保表中唯一的IDENTITY列不同,ROWGUIDCOL属性确保更商级别的唯一。这种唯一的ID保存在uniqueidentifier数据类型中,并且由NEWID系统函数生成。也可以使用NEWSEQUENTIALID系统函数来产生uniqueidentifier返回类型;但是,它与NEWID不同,因为每个新生成的GUID都大于其他服务器范围内生成的GUID。因为NEWSEQUENTIALID在每次执行时...原创 2020-08-09 09:22:46 · 412 阅读 · 0 评论 -
SqlServer2008实例46使用系统函数检测服务器、数据库以及连接级别的配置
SQL Server包含了一些用于检测SQL Server实例的系统设置的系统配置函数口有一些函数带有@@前缀,在之前版本的SQL Server中叫做变量。其他系统函数没有@@前缀,并且接受用于帮助收集有关SQL Server实例或者数据库信息的参数。 1.确定每周的第一天 @@DATEFIRST函数返回SQL Servcr实例指定的每周第一天的值。因为这个值定义了诸如DATEPART和DATEADD等其他日期函数使用的每周工作日datepart的计算,所以这是需要关注的。...原创 2020-08-08 09:50:16 · 294 阅读 · 0 评论 -
SqlServer2008实例45排名函数
目录1.生成递增行号2.根据排名返回行3.根据无间隔排名返回行4.使用NTILE可以使用排名函数返回和结果集中的每行关联的排名值。 排名函数函 数 描 述 ROW_NUMBER 为结果集中的每行返回递增整数 RANK 和ROW_NUMBER相似.RANK为结果集中的每行递增值.主要的区别是如果行有重复值,它们会有相同的排名值 DENSE_RANK DENSE_RANK和RANK几乎一样,只是如果行有重复值,DENS...原创 2020-08-07 09:32:18 · 235 阅读 · 0 评论 -
SqlServer2008实例44类型转换
CONVERT和CAST函数都是用来将一种数据类型转换为另一种数据类型。CAST的语法如下所示: CAST(expression AS data_type[(length)]) 第一个参数是要转换的表达式(例如一个表列或字面量值)。第二个参数是要转换成的数据类型。 CONVERT的语法如下: CONVERT(data_type[(length)],expression[,style】) 第一个参数是要转换成的数据类型。第二个参数是需要转换的表达式。第三个参数s...原创 2020-08-07 08:43:45 · 439 阅读 · 0 评论 -
SqlServer2008实例43日期函数
SQL Server肯几种用来存储日期和时间数据的数据类型:datetime、datetime2、date、time、datatimeoffset和smalldatetime。SQL Server提供了一些使用这些日期函数函数名 描 述 DATEADD DATEADD根据指定的问隔和数字返回一个增加或减少后的新同期 DATEDIFF DATEDIFF从第_1个日期减去第—个日期,并生成一个指定的datepart码格式的值 DATENAME DATENAME返...原创 2020-08-05 17:35:55 · 427 阅读 · 0 评论 -
SqlServer2008实例42NULL函数
由于NULL值是未知的,它可能会弄乱相关代码-SQL Server提供了函数来处理代码中的NULL值, NULL函数函数名 描 述 ISNULL ISNULL检测表达式是否为NULL,如果是的话替换NULL值为另外一个值 COALESCE COALESCE函数返回指定表达式列表的第一个非NULL值 NULLIF 当指定的两个表达式有相同值的时候,NULLIF返回NULL值,否则返回第一个表达式的值下面的几...原创 2020-08-05 11:35:32 · 343 阅读 · 1 评论 -
SqlServer2008实例41字符串函数
目录1 把字符值转化为ASCII以及把ASCII转回字符2.返回整数和字符Unicode值3.获取某个字符串在另一个字符串中的起始位置4.使用通配符找到某个字符串在另一个字符串中的起始位置5.检测字符串相似度6.获取字符串最左和最右部分7.检测字符串中的字符数或者字节数8.把字符串的一部分替换成另一个字符串9.把字符串填充到字符串中10.在小写和大写之间进行转化11.移除前导空格和尾部空格12.重复一个表达式N次13.重复一个空格N次14.逆序输出..原创 2020-08-01 15:23:43 · 298 阅读 · 0 评论 -
SqlServer2008实例40数学函数
目录示例1 POWER示例2 ROUND示例3.RAND示例4 RAND 数学函数函 数 描 述 ABS 计算绝时值 ACOS 计算其余弦是所指定参数的角(弧度) ASIN 计算其正弦是所指定参数的角(弧度) ATAN 计算其正切是所指定参数的角(弧度) ATN2 计算其正切介于两个浮点表达式之间的角(弧度) CEILING 计算大于或等于指定参数的最小整数 COS 计...原创 2020-08-01 09:57:07 · 151 阅读 · 0 评论 -
SqlServer2008实例39聚合函数
目录1.返回平均值2.返回行总数3.找出表达式中的最小值和最大值4.返回值的和5.使用统计聚合函数 示例1 VAR函数根据数据母体的样本返回由表达式提供的值的方差(VARP函数也返回衷达式整个数据母体提供的值的方差)。示例2 STDEV函数根据数据母体的样本返回由表达式提供的所有值的标准差。聚合函数用于对一个或多个值进行计算,最后得出一个值。经常使用的聚合函数的一个例子是SUM,它用来返回一组数字值的总值。 SQL Server...原创 2020-08-01 09:40:27 · 368 阅读 · 0 评论 -
SqlServer2008实例38索引视图之强制优化器为索引视图使用索引
一旦创建了索引视图,如果使用的是SQL Server企业版,查询优化器会自动决定是否需要在查询中使用索引视图。然而,对于其他的版本,要使SQL Server使用某个索引视图,必须使用NOEXPAND关键字。 通过在FROM子句后增加WITH(NOEXPAND)视图提示,指示SQL Server只可以使用视图索引。{ NOEXPAND [,INDEX ( index_val [,...n])]}例如,强制查询使用索引视图的索引:USE AdventureWorksGOSELE...原创 2020-07-31 10:30:31 · 237 阅读 · 0 评论 -
SqlServer2008实例38索引视图之创建索引视图
视图并不比定义它的底层SELECT查询更有效。然而,一个可以提升经常被访问的视图性能的方法就是为之添加索引。要这么做,必须先在视图上创建一个唯一的聚集索引。一旦视图上的索引被创建,用于物化视图的数据就像表的聚集索引那样保存。在视图上创建了唯一的聚集索引之后,你还可以创建另外的非聚集索引。基础表不会受到这些视图索引创建的影响,因为它们是独立的基础对象。 索引视图能在任何版本的SQL Server中创建,但是只有SQL Server企业版的查询优化器能自动在查询执行计划中考虑使用索引视图。在SQ...原创 2020-07-31 10:18:06 · 660 阅读 · 0 评论 -
SqlServer2008实例37视图加密
CREATE VLEW和ALTER VIEW命令中的ENCRYPTION OPTION允许我们加密视图的T-SQL。一旦加密,就不能再通过sys.sql_modules系统目录视图查看视图定义。在后端使用SQL Servert的软件厂商经常加密它们的视图或存储过程,目的是防止客户端或竞争对手篡改或进行逆向工程。如果使用加密,请确保保存了原始的、未加密的定义。USE AdventureWorksGOCREATE VIEW dbo.v_Product_TopTenListPriceWITH...原创 2020-07-31 08:46:23 · 1031 阅读 · 0 评论 -
SqlServer2008实例36视图之使用视图修改数据
可以像普通表那样对视图进行插入、更新和删除操作一要实现这些操作,任何INSERT,UPDATE,DELETE操作只能引用一个表中的列。而且,INSERT,UPDATE,DELETE中引用的列不能进行衍生——例如,它们不能基于聚合函数被计算或受GROUP BY、DISTINCT或HAVING子句的影响。 作为真实情况的最佳实践,只有当基础数据表必须对查询编写者不可见的时候,才应该使用视图更新。例如,如果你正在编写允许用户直接更新数据的套装软件应用程序,那么就能通过提供视图来过滤查看的基础列或提供比...原创 2020-07-31 08:38:11 · 538 阅读 · 0 评论 -
SqlServer2008实例36视图之删除视图
使用DROP VIEW命令来删除一个视图。语法:DROP VIEW [ schema_name . ] view_name [ ; ] 这个命令只接受一个参数,即需要从数据库中删除的一个或多个视图名。例如:USE AdventureWorksGODROP VIEW dbo.v_Product_TransactionHistory删除视图会从系统目录中移除它的定义,如果它是索引视图,相关的所有索引也会被移除。...原创 2020-07-31 08:24:47 · 544 阅读 · 0 评论 -
SqlServer2008实例36视图之修改视图
ALTER VIEW命令用来修改既有视图的定义。语法如下:ALTER VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ][ WITH [ ENCRYPTION ] [ SCHEMABINDING ] [ VIEW_METADATA ] [ ,...n ] ]AS select_statement[ WITH CHECK OPTION ] ALTER VIEW和CREATE VIEW使用相同的参数。例如:修改既有视图:U.原创 2020-07-30 10:04:05 · 746 阅读 · 0 评论 -
SqlServer2008实例36视图之刷新视图定义
当视图引用的表对象修改后,视图的元数据可能就过时了。例如,如果更改在视图定义中引用的列的宽度,那么在刷新元数据之前新的宽度可能不会生效。在这个技巧中,会演示在视图定义中引用的依赖对象修改后,如何刷新视图的元数据:USE AdventureWorksGOEXEC sp_refreshview 'dbo.v_product_TransactionHistory' 也可以使用系统存储过程sp_refreshsqlmodule,它不仅仅可以使用在视图上,也可以使用到存储过程、触发器...原创 2020-07-30 09:32:17 · 354 阅读 · 0 评论 -
SqlServer2008实例36视图之显示视图及其结构
1.显示当前数据库中所有的视图:USE AdventureWorksGOSELECT s.name SchemaName,v.name ViewNameFROM sys.views vINNER JOIN sys.schemas s ON v.schema_id=s.schema_idORDER BY s.name,v.name 2.显示当前数据库中每个视图公开的列:USE AdventureWorksGOSELECT v.name ViewName,c.name .原创 2020-07-30 09:23:25 · 501 阅读 · 0 评论 -
SqlServer2008实例36视图之查询视图定义
可以通过查询sys.sql_modules系统目录视图来查看视图的T-SQL定义。 查询某个视图的SQL定义:USE AdventureWorksGOSELECT definition FROM sys.sql_modulesWHERE object_id=OBJECT_ID('dbo.v_Product_TransactionHistory')原创 2020-07-30 09:01:28 · 229 阅读 · 0 评论 -
SqlServer2008实例36视图之创建基本视图
使用CREATE VI刚命令来创建视图。语法如下:CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ][ WITH [ ENCRYPTION ] [ SCHEMABINDING ] [ VIEW_METADATA ] [ ,...n ] ]AS select_statement[ WITH CHECK OPTION ] CREATE VIEW参数参 数 描 述 [ schema_nam...原创 2020-07-30 08:49:58 · 592 阅读 · 0 评论 -
SqlServer2008实例36视图之普通视图
使用视图可以创建由SELECT语句定义的表数据的虚拟表现。定义的SELECT语句能联结一个或者多个表,能包含一个或者多个列。一旦创建,视图能在查询的FROM子句中被引用。 视图能用来为查询编写者简化数据访问,隐蒧底层SELECT语句的复杂度。视图对管理安全和保护敏感数据同样有用。如果希望限制最终用户直接访问表,可以对视图授予执行权限,而不是对底层的表。还可以通过在视图定义中仅仅包含必要的列,暴露那些仪仪希望被最终用户看到的列。在某些情况下,视图甚至能允许直接的数据更新。视图也对后台数据提供了...原创 2020-07-30 08:22:50 · 250 阅读 · 0 评论 -
SqlServer2008实例35排名搜索之根据权值返回排名搜索结果
使用CONTAINSTABLE命令根据加权模式匹配来返回搜索结果。CONTAINSTABLE和FREETEXTTABLE一样都表现为一个表并且能被FROM子句引用。CONTAINSTABLE也和CONTAINS有一样的搜索功能及变化形式。 CONTAINS和CONTAINSTABLE都能指定行匹配的“权值”,让一个项比另外一个更重要,因此也会影响结果排名。这通过命令中的ISABOUT来实现,它为搜索项分配一个权值。其基本语法如下:ISABOUT { <search> } [...原创 2020-07-29 10:59:21 · 163 阅读 · 0 评论 -
SqlServer2008实例35排名搜索之根据含义返回排名搜索结果
SQL Server同样支持在查询的FROM子句中使用排名函数。排名函数CONTAINSTABLE和FREETEXTTABLE不返回符合搜索条件的行,它们用来根据相关性返回指定的行。越是接近匹配,系统就给予越高的排名。 FREETEXTTABLE能根据搜索字符串按照排名的次序返回搜索结果。FREETEXTTABLE (table , { column_name | (column_list) | * } , 'freetext_string' ...原创 2020-07-29 10:53:20 · 123 阅读 · 0 评论 -
SqlServer2008实例34高级搜索之使用CONTAINS根据词的相邻搜索结果
使用CONTAINS来找到某个单词和另外一个互相接近的行。语法如下:{<simple_term> | <prefix_term>} {NERA | ~}{<simple_term> | <prefix_term>}USE AdventureWorksGOSELECT DocumentSummaryFROM Production.DocumentWHERE CONTAINS (DocumentSummary,'oil NEAR .原创 2020-07-29 10:30:07 · 179 阅读 · 0 评论 -
SqlServer2008实例34高级搜索之使用CONTAINS来搜索变形匹配
在这个技巧中,会演示如何基于变形形式来搜索匹配搜索项的行。搜索变形形式的基本语法如下:FORMSOF ( { INFLECTIONAL | THESAURUS} , <simple_term> [,...n] )搜索replace的变形形式:USE AdventureWorksGOSELECT DocumentID,DocumentSummaryFROM Production.DocumentWHERE CONTAINS (DocumentSummary,'FORMSO原创 2020-07-29 10:24:39 · 357 阅读 · 0 评论 -
SqlServer2008实例34高级搜索之使用CONTAINS和通配符来搜索
使用CONTAINS我们还能对单词或短语执行更高级的搜索。包括: 使用通配符搜索来匹配某个文本前缀的单词或短语; 根据某个单词的变形形式搜索单词或短语; 根据单词之间的相邻搜索单词或短语。 1.在CONTAINS搜索中使用通配符。在星号通配符之前指定前缀项:USE AdventureWorksGOSELECT DocumentID,DocumentSummaryFROM Production.DocumentWHERE CONTAINS (Docu...原创 2020-07-29 10:11:18 · 654 阅读 · 0 评论 -
SqlServer2008实例33基本搜索之使用CONTAINS来搜索单词
CONTAINS能以比FREETEXT谓词更灵活的全文项来搜索。基本语法如下:CONTAINS ( { column_name | ( column_list ) | * }, '<contains_search_condition>' [ , LANGUAGE language_term ] ) 参数和FREETEXT-样,只是CONTAINS允许各种搜索条件搜...原创 2020-07-29 10:05:42 · 337 阅读 · 1 评论 -
SqlServer2008实例33基本搜索之使用FREETEXT来搜索全文索引的列
创建了全文目录和全文索引后,就可以使用更灵活的T-SQL谓词查询数据了。谓词用在WHERE或HAVING子句的表达式中或者FROM子句的联结条件中。谓词返回TRUE、FALSE或UNKNOWN值。 FREETEXT命令用来基于变形的、字面的、同义的匹配方式搜索非结构化的文本数据。它比使用LIKE的方式更智能,因为文本数据是按照意思而不是准确的单词来搜索。USE AdventureWorksGOCREATE FULLTEXT CATALOG cat_Production_Doc...原创 2020-07-29 09:58:48 · 432 阅读 · 0 评论 -
SqlServer2008实例32全文索引和全文目录之删除全文目录
通过DROP FULLTEXT CATALOG命令从数据库中删除全文目录。语法如下所示:DROP FULLTEXT INDEX ON table_name这个命令只有一个参数,就是要删除的全文目录的名称,例如:USE AdventureWorksGODROP FULLTEXT INDEX ON Production.Document...原创 2020-07-28 08:45:31 · 220 阅读 · 0 评论