最近一直在忙着导数据,写着各种对应的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 ##TempAll11 (12 ID INT ,13 Name NVARCHAR(50) ,14 Age INT ,15 UID INT16 );17 18 ----with开头的临时表19 WITH t AS ( SELECT a.ID ,20 a.Name21 FROM #Temp AS a22 INNER JOIN ##TempAll AS b ON b.ID = b.UID23 )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.DISTINCTSELECT DISTINCT NameFROM #Temp;----2.Group By 去重SELECT NameFROM #TempGROUP BY NameHAVING 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 - int11 N'www', -- Name - nvarchar(50)12 100 -- Age - int13 )14 15 INSERT INTO #Temp16 ( ID, Name, Age )17 VALUES ( 2, -- ID - int18 N'jjj', -- Name - nvarchar(50)19 10 -- Age - int20 )21 --开始事务22 BEGIN TRANSACTION tran_bank;23 DECLARE @tran_error INT;24 SET @tran_error = 0;25 26 -----try catch27 BEGIN TRY28 INSERT INTO #Temp29 ( ID, Name, Age )30 VALUES ( 'w', -- ID - int31 N'jjj', -- Name - nvarchar(50)32 10 -- Age - int33 )34 SET @tran_error = @tran_error + @@error; 35 UPDATE #Temp36 SET Age = Name - 1000037 WHERE ID = 2; 38 SET @tran_error = @tran_error + @@error; 39 UPDATE #Temp40 SET Age = Age + 1000041 WHERE ID = 1; 42 SET @tran_error = @tran_error + @@error;43 PRINT @tran_error44 END TRY45 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 END58 59 60 IF ( @tran_error > 0 )61 BEGIN62 --执行出错,回滚事务63 ROLLBACK TRAN;64 PRINT '事务失败,回滚事务';65 END;66 ELSE67 BEGIN68 --没有异常,提交事务69 COMMIT TRAN;70 PRINT '提交事务';71 END;72 73 DROP TABLE #Temp
暂时先写到这里,遇到了,再整理。。。