SQL 存储过程(2)

数据类型

字符字符串  字符常量使用引号进行分隔。
char  存固定大小的字符串,最大8000个字符。不足将用空格填满。
varchar  最大8000字符。不足不用空格填满,按原样记录。占用2个额外字节。
text 存储大型数据,最大为2GB。

Unicode字符字符串  字符常量使用引号进行分隔,并用N为前缀。比如:values(N'CODSD')
nchar  存固定大小的字符串,最大4000个字符。不足将用空格填满。
nvarchar  最大4000字符。不足不用空格填满,按原样记录。
ntext  存储大型数据,最大为1GB。

日期和时间的数据类型
datetime 占8字节,精度3.33ms 日期范围1753年1月1日到9999年12月31日
smalldatetime 占4字节,精度1ms,日期范围1900年1月1日到2079年6月6日
日期和时间常量在SQL中用引号分隔符分隔。Set DateOfBirth='2/21/1983 10:10 AM'

整数
int
smallint
tinyint
bigint
bit逻辑真或逻辑假

近似数字(近似计算) 避免使用'=',而是使用'<','>'等符号。
real单精度,精度最多7位。
float双精度,精度最多15位。

精确数字(非近似计算,必须指定小数位数和精度)
decimal 精度最大为38位。Weight decimal(10,3) 小数位数为3位,小数之前最多7位。
numeric

未定数据类型sql_variant
可以存储除text,ntext,image,timestamp,sql_variant这些类型以外的任何数据类型。
但使用它们时必须限制为:
·键中数据总长度小于900个字节,可以在索引和唯一键中使用sql_variant列。
·不能具有identity属性。
·不能是计算列的一部分。
·在Like谓词中不受支持。
·不支持全文索引。
·不可使用+运算符进行串联运算。
·有些函数不支持sql_variant类型的参数比如AVG,IDENTITY,ISNUMBER,POWER,ROUND,SIGN,SUM,VAR,VARP,RADIANS


局部变量  必须以@开头
Declare @LastName varchar(50),
        @FirstName varchar(30)

全局变量 必须以@@开头
@@identity

SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是相似的函数,因为它们都返回插入到标识列中的值。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。有关详细信

息,请参阅 IDENT_CURRENT (Transact-SQL)。

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中

的值;@@IDENTITY 不受限于特定的作用域。


@@error 记录错误编码。

@@rowcount 记录该语句影响到的总的记录条数,用来确认选择操作的成功与否。

 

table 变量[表变量] 变量具有下列优点:

A. table 变量的行为类似于局部变量,有明确定义的作用域。这就是在其中声明该变量的函数、存储过程或批处理。

在其作用域内,table 变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的任何地

方。但是,table 不能用于以下语句中:

SELECT select_list INTO table_variable  
 
在定义 table 变量的函数、存储过程或批处理结束时,会自动清除此变量。


table 类型声明中的 CHECK 约束、DEFAULT 值和计算列不能调用用户定义函数。


在存储过程中使用 table 变量与使用临时表相比,减少了存储过程的重新编译量。


涉及 table 变量的事务只在 table 变量更新期间存在。因此减少了 table 变量对锁定和记录资源的需求。


不能显式创建 table 变量的索引,也不保留 table 变量的任何统计信息。在某些情况下,可以通过改用支持索引和统计信息的临时表来改善

性能。有关临时表的详细信息,请参阅CREATE TABLE (Transact-SQL)。

可以在批处理的 FROM 子句中按名称引用 table 变量,如下例所示:
 
SELECT Employee_ID, Department_ID FROM @MyTableVar
 
在 FROM 子句外,必须使用别名来引用 table 变量,如下例所示:
-----------------------------------------------------------
SELECT EmployeeID, DepartmentID
FROM @MyTableVar m
JOIN Employee on (m.EmployeeID =Employee.EmployeeID AND
   m.DepartmentID = Employee.DepartmentID)
-----------------------------------------------------------
不支持在 table 变量之间进行赋值操作。另外,由于 table 变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。
 

 

T-SQL游标
步骤:
·使用Declare Cursor语句,根据Select语句创建游标。
·使用Open语句填充游标。
·使用Fetch语句更改游标中的当前记录,并将值存储在局部变量中。NEXT,PRIOR,FIRST,LAST
·对检索的信息进行某些处理。
·如有必要重复步骤3,4。
·使用Close语句关闭该游标,然后释放大部分的资源(内存,锁等)。
·使用Deallocate语句清除该游标。

下面的示例用@@FETCH_STATUS控制在一个WHILE循环中的游标活动

每执行一个FETCH操作之后,通常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。该变量有三种状态值:
 0   表示成功执行FETCH语句。
-1   表示FETCH语句失败,例如移动行指针使其超出了结果集。
-2   表示被提取的行不存在。

由于@@FETCH_STATU是全局变量,在一个连接上的所有游标都可能影响该变量的值。因此,在执行一条FETCH语句后,必须在对另一游标执行另

一FETCH 语句之前测试该变量的值才能作出正确的判断。

-----------------------------------------------------------
/* 使用游标读取数据的操作如下。*/

DECLARE E1cursor cursor       /* 声明游标,默认为FORWARD_ONLY游标 */

FOR SELECT * FROM c_example

OPEN E1cursor                 /* 打开游标 */

FETCH NEXT from E1cursor      /* 读取第1行数据*/


WHILE @@FETCH_STATUS = 0      /* 用WHILE循环控制游标活动 ,@@fetch_status表示当前游标的状态*/

BEGIN

   FETCH NEXT from E1cursor    /* 在循环体内将读取其余行数据 */

END


CLOSE E1cursor                /* 关闭游标 */

DEALLOCATE E1cursor           /* 删除游标 */
-----------------------------------------------------------


语法
-----------------------------------------------------------
Declare @curTables Cursor
Set @curTables=Cursor FOR
 select name
  from sysobjects
  where xType='U'
-----------------------------------------------------------
Fetch Next From @curtables
Into @chvTable

While(@@fetch_status=0)
begin
 ......
end
-----------------------------------------------------------


函数的使用
函数是用来对0个或多个输入参数进行求值并返回数据给调用者的元素。
SELECT Sin(45) --显示45度正弦值
GetDate()  --调系统时间
-----------------------------------------------------------
Select @chvMake=Make,   --局部变量
       @Model=Model,    --局部变量
       @dtsCurrentDate=GetDate()  --将函数值赋给局部变量
from EquipmentID=@intEqId  
-----------------------------------------------------------
Create Procecure PRP
 @intValue01 int,
 @intValue02 int
As
 Insert Lease(Lea,Sta,EndDate,LeaF)
 Values(@intValue01,GetDate(),DateAdd(Year,3,GetDate()),@intValue02)   --DateAdd(...)截止日期为当前日期3年后
return @@Error
-----------------------------------------------------------

INNER JOIN 组合两个表中的记录,只要在公共字段之中有相符的值。

用 INNER JOIN语法联接多个表建记录集 多表联接建立记录集是十分有用的,因为某些情况下,我们需要把数字数据类型显示为相应的文本名

称,这就遇到了多表联接建立记录集的问题。

INNER JOIN ……ON的语法格式:

    FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON 表1.字段

号=表4.字段号) INNER JOIN 表X ON Member.字段号=表X.字段号
   
    连接两个数据表的用法:
    FROM Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort
    语法格式可以概括为:
    FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号
   
    连接三个数据表的用法:
    FROM (Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON

Member.MemberLevel=MemberLevel.MemberLevel
    语法格式可以概括为:
    FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号


系统函数

·Case 条件表达式

select @insDays=
CASE @chv1
  When 'monthly' then 30
  When 'bi-weekly' then 40
END
return

获取数据信息函数
·IsDate() 是否是合法日期的函数,真值为1。
·IsNumeric() 确定是否可以将一个字符值或表达式转换为某一数字数据类型。
·DateLength()返回存储或显示一个表达式所用的字节数。
·Binary_CheckSum()对指定表达式或表列集的二进制校验和进行计算,用于检测在记录中所做的修改。


处理空值的函数
·NullIf(expression,expression)如果函数中两个表达式的值相等,那么NullIf()将返回空值。如果两个表达式的值不相等,该函数将返回第

一个表达式的值。
-------------------------------------------------------
select AVG(Rent)                --计算平均值的时候仅包括非空的值。
       AVG(NullIf(Rent,0))   --计算平均值的时候包括空值。
from Inventory
-------------------------------------------------------

·IsNull(check_expression,replacement_value)对check_expression进行检测,如果值为空,函数将返回replacement_value。如果

check_expression值非空,该函数将返回check_expression。
-------------------------------------------------------
select AVG(Rent)
       AVG(ISNULL(Rent,0))
from Inventory
-------------------------------------------------------

·Coalesce(expression[,...n])函数经常用于合并被拆分到若干列中的各个值。返回结果是第一个非空表达式。(盲点不是很明白)


转换函数:显示的将某一种数据类型的信息转换成另一种特定的数据类型信息。
·Cast(expression AS data_type)    不允许指定返回结果的格式
Cast(@@error as varchar)

·Convert(data_type[(length)],expression[,style]) 允许指定返回结果的格式。style意指将日期和时间或数字表达式转换为字符串时所用

的格式化样式。
Convert(varchar,GetDate(),104)

style数字在转换时间时的含义如下:
------------------------------------------------------------------------------------------------------------
Style(2位表示年份)               |   Style(4位表示年份)             |    输入输出格式                             
------------------------------------------------------------------------------------------------------------
0                                |   100                            |    mon dd yyyy hh:miAM(或PM)             
------------------------------------------------------------------------------------------------------------
1                                |   101     美国                   |    mm/dd/yy                                      
------------------------------------------------------------------------------------------------------------
2                                |   102     ANSI                   |    yy-mm-dd                                       
------------------------------------------------------------------------------------------------------------
3                                |   103     英法                   |    dd/mm/yy                                      
------------------------------------------------------------------------------------------------------------
4                                |   104     德国                   |    dd.mm.yy                                       
------------------------------------------------------------------------------------------------------------
5                                |   105     意大利                 |    dd-mm-yy                                       
------------------------------------------------------------------------------------------------------------
6                                |   106                            |    dd mon yy                                       
------------------------------------------------------------------------------------------------------------
7                                |   107                            |    mon dd,yy                                       
------------------------------------------------------------------------------------------------------------
8                                |   108                            |    hh:mm:ss                                        
------------------------------------------------------------------------------------------------------------
9                                |   109                            |    mon dd yyyy hh:mi:ss:mmmmAM(或PM)
------------------------------------------------------------------------------------------------------------
10                               |   110     美国                   |    mm-dd-yy                                        
------------------------------------------------------------------------------------------------------------
11                               |   111     日本                   |    yy/mm/dd                                       
------------------------------------------------------------------------------------------------------------
12                               |   112     ISO                    |    yymmdd                                          
------------------------------------------------------------------------------------------------------------
13                               |   113     欧洲默认值             |    dd mon yyyy hh:mi:ss:mmm(24小时制) 
------------------------------------------------------------------------------------------------------------
14                               |   114                            |    hh:mi:ss:mmm(24小时制)                   
------------------------------------------------------------------------------------------------------------
20                               |   120     ODBC 规范              |    yyyy-mm-dd hh:mi:ss(24小时制)        
------------------------------------------------------------------------------------------------------------
21                               |   121                            |    yyyy-mm-dd hh:mi:ss:mmm(24小时制)
 
将货币值转换为字符信息时的含义如下:
0(默认值) 小数点坐侧每三位数字之间不用逗号分隔,小数点右边取两位 如1234.56
1     小数点坐侧每三位数字之间用逗号分隔,小数点右边取两位 如1,234.56
2           小数点坐侧每三位数字之间不用逗号分隔,小数点右边取四位 如1234.5678


将浮点数或实型数转换为字符信息:
0(默认值) 最大为6位数
1     始终为8位
2     始终为16位


当前会话信息:函数返回和当前会话有关的信息

App_Name() 返回打开会话的应用程序名称。
Host_Id() 返回工作站表识号。
Host_Name() 返回工作站名称。
Permissions() 返回位图的值,表明选定列,数据库对象或当前数据库权限。
Current_User 返回数据库用户名。
Session_User 返回当前会话的数据库用户名。
System_User 返回当前会话的服务器登陆名。
User_Name() 返回数据库用户名。

比如使用System_User函数表识往系统中添加订单的用户。
if @chvUserName=null
  Set @chvUserName=system_User


标识值处理函数
Ident_Seed("expression") 返回种子值
Ident_Incr("expression") 返回表的增量值

@@identity 返回当前会话的标识值,无论是否同一作用域(同一个存储过程,触发器或批处理就是同一作用域)
Ident_Current("expression") 返回任何作用域,在指定表中设置的最后一个标识值
Scope_Identity() 返回当前会话同一作用域的标识值。参见第9.5节


日期和时间函数
GetDate()
DAY(date)
MONTH(date)
YEAR(date)
DatePart(datepart,date)  /datepart为year,quarter,month,dayofyear,day,week,weekday,hour,minute,second,millisecond
DateName(datepart,date)  /datepart为year,quarter,month,dayofyear,day,week,weekday,hour,minute,second,millisecond

比如:
Select GetDate() As 'Date',
       DateName(month,GetDate()) As 'Month Name',
       DatePart(month,GetDate()) As 'Month',
       DatePart(year,GetDate()) As 'Year'

Date               Month Name      Month     Year
-----------------------------------------------------
2003-02-20 00:45   February        2         2003


字符串函数
Len(string_expression)返回字符串长度
DateLength()系统函数,返回字符串占用的字节数
Left(character_expression,integer_expression) 返回从字符串左边起指定的字符个数
Right(character_expression,integer_expression) 返回从字符串右边起指定的字符个数
SubString(expression,start,length)从start个字符开始,长度为length的字符串 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值