关于sql server 的那些事

     最近一直在忙着导数据,写着各种对应的sql,在导数据中遇到形形色色的问题。有些东西很久没有使用,大部分都遗忘的差不多了,真是好不容易抽个时间来进行梳理一下。

   一、临时表:

     SQL SERVER 中创建临时表,临时表有两种类型,一个是本地临时表:以#开头,本地临时表仅在当前会话中可见;;另一个就是全局临时表,以##开头,全局临时表在所有会话中都可见。  with 开头的临时表,只能在括号后中使用,一般针对条件比较复杂的条件,或者排序,会经常会使用到的,生命周期就是这句话结束后就会释放。而上面两种以#和##开头的需要手动释放资源, 形式如下:

 1 ---临时表
 2 CREATE TABLE #Temp
 3     (
 4       ID INT ,
 5       Name NVARCHAR(50) ,
 6       Age INT
 7     );
 8 
 9 ---全局临时表
10 CREATE TABLE ##TempAll
11     (
12       ID INT ,
13       Name NVARCHAR(50) ,
14       Age INT ,
15       UID INT
16     );
17 
18 ----with开头的临时表
19 WITH    t AS ( SELECT   a.ID ,
20                         a.Name
21                FROM     #Temp AS a
22                         INNER JOIN ##TempAll AS b ON b.ID = b.UID
23              )
24     SELECT  *
25     FROM    t;
26 
27 ---释放临时表
28 DROP TABLE #Temp;
29 DROP TABLE ##TempAll;

  二、解析,编译sql

      针对导数据时,写了一堆sql,不敢轻易执行,最好执行前先解析,编译,是否存在问题。在SQL SERVER中提供 SET PARSEONLY { ON | OFF }   和SET NOEXEC { ON | OFF }   语句。

      SET  PARSEONLY 表示只解析但不编译或执行语句。它会检查Tansact-SQL语句的语法并返回任何错误信息。 SET  PARSEONLY on 开始分析语句,OFF 开始编译执行语句。

      SET NOEXEC 表示编译但不执行语句。可以让 SQL Server 在执行 Transact-SQL 代码时,验证代码中的语法和对象名。它也可以用于调试通常是较大的批处理中的部分语句。

---解析
SET PARSEONLY ON; 
GO
-----检查的语句
SELECT  *
FROM    ##TempAll;        

---编译执行
SET PARSEONLY OFF;
GO
-----------------------------------------
---编译
SET NOEXEC ON;
GO
----编译的语句
SELECT  *
FROM    dbo.S_SJZD;
GO 

-----开始编译执行
SET NOEXEC OFF; 
GO 

  三、去重

    导数据时经常会遇到各种重复数据,去重也是重要的一环。常用的去重方法,我只道三种,1)DISTINCT;2)GROUPY BY ;3) ROW_NUMBER() OVER  排序去重。每一种都有各自的优缺点。

 

-------去重
----1.DISTINCT
SELECT DISTINCT
        Name
FROM    #Temp;

----2.Group By 去重
SELECT  Name
FROM    #Temp
GROUP BY Name
HAVING  COUNT(Name) > 1;

---3.排序去重
WITH    t AS ( SELECT   ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name DESC ) AS a ,
                        *
               FROM     #Temp
             )
    SELECT  *
    FROM    t
    WHERE   a = 1;

  四、事务

     事务四大特性:原子性、一致性、隔离性以及持久性。Transact-SQL 中主要语法 1 开始事务: begin transaction ;2 提交事务:commit transaction ;3 回滚事务: rollback transaction。

 1 CREATE TABLE #Temp
 2         (
 3           ID INT ,
 4           Name NVARCHAR(50) ,
 5           Age INT
 6         );
 7      
 8      INSERT INTO #Temp
 9              ( ID, Name, Age )
10      VALUES  ( 1, -- ID - int
11                N'www', -- Name - nvarchar(50)
12                100  -- Age - int
13                )
14      
15      INSERT INTO #Temp
16              ( ID, Name, Age )
17      VALUES  ( 2, -- ID - int
18                N'jjj', -- Name - nvarchar(50)
19                10  -- Age - int
20                )
21         --开始事务
22     BEGIN TRANSACTION tran_bank;
23     DECLARE @tran_error INT;
24     SET @tran_error = 0;
25 
26     -----try catch
27     BEGIN TRY
28     INSERT INTO #Temp
29              ( ID, Name, Age )
30      VALUES  ( 'w', -- ID - int
31                N'jjj', -- Name - nvarchar(50)
32                10  -- Age - int
33                )
34   SET @tran_error = @tran_error + @@error;  
35         UPDATE  #Temp
36         SET     Age = Name - 10000
37         WHERE   ID = 2;        
38         SET @tran_error = @tran_error + @@error;     
39         UPDATE  #Temp
40         SET     Age = Age + 10000
41         WHERE   ID = 1;      
42         SET @tran_error = @tran_error + @@error;
43         PRINT @tran_error
44     END TRY
45     BEGIN CATCH        
46         PRINT '出现异常,错误编号:' + CONVERT(VARCHAR, ERROR_NUMBER()) + ', 错误消息:'
47             + ERROR_MESSAGE(); 
48         SET @tran_error = @tran_error + 1;
49         GOTO Lend;
50 
51     END CATCH;
52 
53 -------goto 
54 Lend:
55    BEGIN 
56      PRINT 'aaaa';
57    END
58 
59 
60     IF ( @tran_error > 0 )
61         BEGIN
62         --执行出错,回滚事务
63             ROLLBACK TRAN;
64             PRINT '事务失败,回滚事务';
65         END;
66     ELSE
67         BEGIN
68         --没有异常,提交事务
69             COMMIT TRAN;
70             PRINT '提交事务';
71         END;
72 
73         DROP TABLE #Temp

 

 

暂时先写到这里,遇到了,再整理。。。

 

转载于:https://www.cnblogs.com/xf2333/p/6908653.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值