欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-02 21:52:07
...
--脏读
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后相比,就是说两个表里有没有行完全相当的。

相关标签: sql