月度归档:2017年08月

MSSQL 字符串组合函数的写法


字符串组合函数的功能为:
将数据表中数据行,组合成一个字符串。
例:
表A
———————————-
keyId info
1 a
1 b
2 c
2 d
3 e
可组合为以下单个字符
组合列
a,b,c,d,e
或按条件组合
a,b
c,d,e

下文将展示字符串组合的方法

方式一:采用变量对字符串进行合并:

/*建表及生成表数据*/
create table A(keyId int,info varchar(30))
insert into A(keyId,info) values(1,'a'),(1,'b'),(2,'c'),(2,'d'),(2,'e'),(2,'f'),(2,'g')
go


declare @infoAll varchar(3000)
set @infoAll =''
select @infoAll =@infoAll+info from A 
print @infoAll
go

truncate table A
drop table A 
go



方式一 扩展:采用sql函数对指定条件的数据行进行合并:

 
 
/*建表及生成表数据*/
create table A(keyId int,info varchar(30))
insert into A(keyId,info) values(1,'a'),(1,'b'),(2,'c'),(2,'d'),(2,'e'),(2,'f'),(2,'g')
go

/*创建字符串组合函数*/
create function dbo.str_join(@keyId int) 
returns varchar(100)
as
begin
  
declare @infoAll varchar(3000)
set @infoAll =''
select @infoAll =@infoAll+','+info from A(nolocK) where keyId=@keyId 
return @infoAll
end
go

/*通过字符串组合函数组合数据1*/
select keyId,dbo.str_join(keyId)  from A   
/*通过字符串组合函数组合数据2*/
select keyId,dbo.str_join(keyId)  from A  group by keyId 
go


drop function dbo.str_join
go
truncate table A
drop table A 
go


方式二 将指定行 采用 xml path直接生成数据

 /*建表及生成表数据*/
create table A(keyId int,info varchar(30))
insert into A(keyId,info) values(1,'a'),(1,'b'),(2,'c'),(2,'d'),(2,'e'),(2,'f'),(2,'g')
go

 

/*通过for xml path组合数据1*/
select keyId,  (
select ',' + info from A for xml path('') 
) as zuhe  from A   
/*通过for xml path组合数据1*/
select A2.keyId,  (
select ',' + info from A where A.keyID=A2.keyId for xml path('') 
) as zuhe  from A as A2
go


 
truncate table A
drop table A 
go

MSSQL存储过程中返回自定义错误消息的方法


当存储过程中运行结果,不是用户所希望的结果时
(例:
影响的行数不是用户所需要的,
得到的数值不是用户想要的
),此时我们通过调用系统函数返回错误信息,
使存储过程调用者收到错误信息,下文将讲述如何在存储过程中返回错误的方法



mssql raiserror函数简介

raiserror函数主要是使DB服务器返回错误信息。

raiserror 函数语法:
raiserror(参数1,参数2, 参数3,[参数4 …]) [with 参数5 ]
参数1:
从sys.messages中选择一个消息号

用户自定义一个小于2047个字符的nvarchar文字

放入一个本地变量代替nvarchar字符
参数2:
用户定义消息级别
0~10 消息级别,则不会进入catch
11~19消息级别,则会进入catch
大于等于20 ,则直接终止数据库连接
参数3(状态):
输入1~127之间的任意整数
输入0 或者大于127 则会生成错误
参数4:
可以输入一个或多个参数替换参数1重的字符
参数5:
输入 log, nowait,seterror
log:在错误日志和应用程序日志中记录错误;
nowait:将消息立即发送给客户端;
seterror:将 @@ERROR 、ERROR_NUMBER 值设置为 参数1 或 50000;


例1:
DECLARE @errInfo nvarchar(50)
SET     @errInfo ='键产生错误信息';
RAISERROR('%s . 这是一个错误信息',16,1, @errInfo)
例2:
RAISERROR (
             N'这是一个错误消息 %s %d 异常.',  -- 自定义消息体,
             8,                        -- 消息级别,
             1,                         -- 参数3,
             N'数值',                    -- 消息体中第一个参数替换.
             5                          -- 消息体中第二个参数替换.
          ); 
例3:

RAISERROR (N'%d %d %s', -- 自定义消息体.
           9,           -- 消息级别,
           3,            -- 级别,
           10,            -- 消息体中第一个参数替换
           20,            -- 消息体中第二个参数替换
           N'string');    -- 消息体中第三个参数替换


例:
存储过程中返回错误信息

  create proc pr_test 
  @a varchar(10)
   as 
   begin
    if @a ='showInfo'
    begin
     raiserror('无效参数:%s',12,1,@a)
     return;
    end 
    select '执行成功'
   end
  go
  exec pr_test 'showInfo'

MSSQL存储过程-重新编译简介

MSSQL在数据库启动后第一次运行存储过程,会将存储过程编译后并放入数据库缓存中。

当存储过程,所涉及的对象,进行索引添加 索引更新 表结构发生变化等架构发生变化时,
存储过程会进行自动重编译操作。

下文将讲述手动对存储过程进行重编译的方法:


1 采用sp_recompile 命令对存储过程进行强制重编译

  exec sp_recompile '存储过程名'  --指定存储过程 下次运行时,进行重编译
  exec sp_recompile '表名'           --指定表名相应的存储过程,进行重编译  
  


2 对存储过程中指定语句,每次运行时,都进行重编译操作

create proc [存储过程名称] 
***
as 
begin
select [列名1],[列名2],[列名3],[列名4] from [表名]  option(recompile)
end


3 对存储过程中指定语句,每次运行时,都进行重编译操作

create proc [存储过程名称] 
***
with recompile 
as 
begin
select [列名1],[列名2],[列名3],[列名4] from [表名](no lock)
end