sql基础_Case_特殊函数_异常_脏读

--脏读
set transaction isolation level read uncommitted;  


--不带参数
SELECT  CASE    
        WHEN 11=1 THEN '十一'   
        WHEN 12=12 THEN '十二'   
        ELSE '零'   
        END  
--带参数
DECLARE @a VARCHAR(20)
SELECT  CASE @a 
        WHEN 11 THEN '十一' 
        WHEN 12 THEN '十二' 
        ELSE '零' 
        END


------关于异常抛出和捕获-----

在存储过程中使用下面的预计抛出异常
RaisError(16, 1, @ErrorMsg) 
RaisError(90018, 16, 1, @ErrorMsg) 
其中 @ErrorMsg 为异常消息(字符串)
在C#中调用存储的地方就会收到异常,此时就可以捕获异常显示异常消息


------特殊的函数:
1, isnumeric( expression )
  -- 返回值 1 | 0,判断是否是数字类型。
  数值类型包括(int、bigint、smallint、tinyint、numeric、money、smallmoney、float、decimal、real)
  示例:
select * from tablename where isnumeric(columnname)<> 1;


2, isdate( expression )
  -- 如果 expression 是有效的 date、time 或 datetime 值,则返回 1;否则返回 0。
  示例:
if isdate('2009-05-12 10:19:41.177') = 1
  print '有效的日期'
  else
  print '无效的日期'


3,  patindex( '%pattern%' , expression )
  -- 返回指定表达式中某模式第一次出现的起始位置;
  -- 如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。
  'pattern' : 一个通配符字符串。pattern 之前和之后必须有 % 字符(搜索第一个或最后一个字符时除外)。
  expression : 通常为要在其中搜索指定模式的字符串数据类型列。
  示例:
select patindex('%BB%','AA_BB_CC_DD_AA_BB_CC_DD')
  -- 返回:4
  上面示例返回的是第一个‘BB’的开始位置。
  其实,使用 charindex 函数也能实现上面示例的查询,如下:
select charindex('BB','AA_BB_CC_DD_AA_BB_CC_DD')
  --返回:4
  patindex 函数与 charindex 函数的区别: 
select patindex('%[0-9][A-Z]%', 'AA_BB_9C_DD_AA_9F_CC_DD')
  -- 返回:7
select charindex('%[0-9][A-Z]%','AA_BB_9C_DD_AA_9F_CC_DD')
  -- 返回:0
  看出来没有?patindex 函数可以使用通配符,而charindex 函数不能。也就是说:patindex 函数功能更强大!



4,  newid( )
  -- 创建 uniqueidentifier 类型的唯一值。
  这个函数总是能返回一个新的GUID号码,它永远不会重复,而且毫无规律。
  示例: 
declare @myid uniqueidentifier
  set @myid = newid() 
  print '@myid 的值是: '+ convert(varchar(255), @myid)
  -- @myid 的值是: 0B939411-4827-485E-884B-5BEB1699CFEE



5,  collate
  -- 一个子句,可应用于数据库定义或列定义以定义排序规则,或应用于字符串表达式以应用排序规则转换。
  collate 子句只能应用于 char、varchar、text、nchar、nvarchar 和 ntext 数据类型。
  示例:
drop table #tempTalbe
  go
  create table #tempTalbe
  (
  _id int,
  _name varchar(30)
  )
  go
  insert into #tempTalbe values(1,'中');
  insert into #tempTalbe values(2,'国');
  insert into #tempTalbe values(3,'人');
  select * from #tempTalbe
  order by _name
  collate latin1_general_cs_as_ks_ws asc;
  go 
  /* 显示结果:
  _id _name
  ----------- ------------------------------
  1 中
  2 国
  3 人
  */
  select * from #tempTalbe
  order by _name
  collate Chinese_PRC_CS_AS_KS_WS asc;
  go
  /* 显示结果:
  _id _name
  ----------- ------------------------------
  2 国
  3 人
  1 中
  */
  注意:
  可以执行系统函数 fn_helpcollations 来检索 Windows 排序规则和 SQL Server 排序规则的所有有效排序规则名称的列表:
  select * from fn_helpcollations()


6,  sp_executesql 存储过程
  建议您在执行字符串时,使用 sp_executesql 存储过程而不要使用 execute 语句。
  由于此存储过程支持参数替换,因此 sp_executesql 比 execute 的功能更多;
  由于 sqlserver 更可能重用 sp_executesql 生成的执行计划,因此 sp_executesql比execute更有效。
  示例:  
create table #tb_suer( id int)
  go
  insert into #tb_suer values(1234)
  go
  declare @tbname nvarchar(20)
  declare @sql nvarchar(500)
  set @tbname='#tb_suer'
  set @sql='select * from ' + @tbname
  execute sp_executesql @sql 
  /* 结果:
  id
  -----------
  1234
  */



7,  checksum
  -- 返回按照表的某一行或一组表达式计算出来的校验和值。 checksum 用于生成哈希索引。
  checksum ( * | expression [ ,...n ] )
  * 指定对表的所有列进行计算。如果有任一列是非可比数据类型,则 checksum 返回错误。
  非可比数据类型有 text、ntext、image、xml 和 cursor,还包括以上述任一类型作为基类型的 sql_variant。
  expression 除非可比数据类型之外的任何类型的表达式。
  示例:
  -- 找出在T1有,T表没有的记录。
select * from t1 where checksum(*) not in ( select checksum(*) from t ) 
  上面示例,等于是把t1表里的一行数据hash和t表一行数据hash后相比,就是说两个表里有没有行完全相当的。

相关推荐