几个很好用SQL语法(SqlServer)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⼏个很好⽤SQL语法(SqlServer)
1,MERGE INTO 语句:
这个语法仅需要⼀次全表扫描就完成了全部⼯作,执⾏效率要⾼于INSERT+UPDATE,作⽤还是很强⼤的(简单的说就是它可以批量更新和插⼊处理⼀个数据集,如果存在就更新指定列,不存在就插⼊)
/****** MERGE INTO 语句运⽤实例 ******/
-- =============================================
-- Author: <Author,yuanchen,Name>
-- Create date: <Create Date,,>
-- Description: <Description,将数据批量新增或更新到[dbo].[Table]中,ID为主键⾃增>
-- =============================================
Create PROCEDURE[dbo].[AddOrUpdateTable]
@Roles UDT_Table READONLY,--⽤户⾃定义表类型(相当于⼀个传⼊的临时表)
@ReturnValue INT OUTPUT --返回值
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION
MERGE INTO[dbo].[Table]AS TARGET --此处[dbo].[Table]是需要插⼊或更新数据的表
USING (SELECT*FROM@UDT_Table) AS SOURCE
ON TARGET.ID = SOURCE.ID --根据此处的列作为条件判断是新增还是更新(多个列作为条件⽤and连接)
WHEN MATCHED
THEN UPDATE
SET
TARGET.[A]=SOURCE.[B],
TARGET.[B]=SOURCE.[B],
TARGET.[UpdateTime]=getdate() --内置函数获取当前时间
WHEN NOT MATCHED
THEN INSERT
([A],[B],[CreateTime])
VALUES(SOURCE.[A],SOURCE.[B],getdate());
SET@ReturnValue=1
COMMIT TRAN
END TRY
BEGIN CATCH
IF XACT_STATE() <>0
BEGIN
ROLLBACK TRANSACTION;
--此处可以⽤Error_message()函数记录⽇志,千万不要在ROLLBACK TRANSACTION前⾯记录⽇志,会被回滚
SET@ReturnValue=-1
END;
END CATCH
END
2,WITH XXX AS 语句:
WITH AS短语,也叫做⼦查询部分(subquery factoring),可以让你做很多事情,定义⼀个SQL⽚断,该SQL⽚断会被整个SQL语句所⽤到。有的时候,是为了让SQL语句的可读性更⾼些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。
特别对于UNION ALL⽐较有⽤。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执⾏⼀遍的话,则成本太⾼,所以可以使⽤WITH AS短语,则只要执⾏⼀遍即可。如果WITH AS短语所定义的表名被调⽤两次以上,则优化器会⾃动将WITH AS短语所获取的数据放⼊⼀个TEMP表⾥,如果只是被调⽤⼀次,则不会。⽽提⽰materialize则是强制将WITH AS短语⾥的数据放⼊⼀个全局临时表⾥。很多查询通过这种⽅法都可以提⾼速度。(更⾼效,可读性更好,复杂的⼦查询推荐使⽤)
With[Table1]As(
select*from[A]inner join[B]on[A].ID=B.[A_ID]--A表和B表连表查询
),[Table2]As(
select*from[C]inner join[Table1] T on[C].ID=T.[C_ID]--C表和A,B表的查询结果连表查询
)Select*From[Table2]
--上⾯的查询结果等同于下⾯这段Sql
select*from[C]inner join (select*from[A]inner join[B]on[A].ID=B.[A_ID]) T on[C].ID=T.[C_ID]
3,游标的常规使⽤,游标可以遍历数据集对每条数据的指定列做处理,处理数据的能⼒也是相当强⼤的,但是滥⽤和使⽤不当可能对造成性能问题哦,⽽且处理复杂的多表多条数据时⼀般都要配合事务⼀起使⽤,不然⼀旦程序错误就会产⽣错误数据
/****** 游标的使⽤实例 ******/
-- =============================================
-- Author: <Author,yuanchen>
-- Create date: <Create Date,>
-- Description: <Description,>
-- =============================================
Create Proc[dbo].[Proc_CURSOR_USE]
AS
BEGIN
SET NOCOUNT ON;
DECLARE@ID BIGINT--定义变量
DECLARE@A BIGINT
DECLARE@B NVARCHAR(100)
Select*INTO #Table From[Table]--将查询结果放⼊临时表
--定义游标
DECLARE CURSOR_JOB01 CURSOR FOR
Select[ID],[A],[B]From #Table--此处可以不⽤临时表,直接写查询语句,但在实际的业务处理中我们需要的查询结果可能是通过复杂的查询语句得到的,直接写在此处,可读性较差OPEN CURSOR_JOB01