zoukankan      html  css  js  c++  java
  • SqlServer 技术点总结(持续更新)

      本文是用于记录自己平时遇到的一些SQL问题或知识点,以便以后自己查阅,会持续的更新,增加内容。发在博客园也可以和各位博友共同学习交流,如文中记录的有错误之处希望指出,谢谢。

    一、用SQL语句调用作业

    1 USE msdb
    2 EXEC sp_start_job @job_name = '作业名称'

    二、SQL语句中GO语句

    1.GO的解释

    官方文档:GO只是SQL Server管理器(SSMS)中用来提交T-SQL语句的一个标志。

    解释:GO向SqlServer实用工具发出一批Transact-SQL语句结束的信号。

    每一个被GO分隔的语句都是一个单独的事务,一批GO隔开的语句执行失败,不会影响其他GO隔开的语句执行。也就是说其中的一个GO失败的,不会影响其他的GO成功。

    但是多个GO之间是有顺序的,前面一个执行完毕,才会执行后面的。

    update xxxx
    set num = 1 
    GO
    
    update student
    set studentNo = 222
    where studentName = '张三'
    GO

    如上的示例:假如数据库中没有'xxxx'表,有'student'表,就是说第一个语句是错误的,第二个语句是正确的。它的执行顺序是'update xxxx'执行完毕再去执行'update student',因为GO是有顺序的;但是由于他们都是单独的事务,所以第一个失败了,但是第二个会成功。

    2.C#中执行的SQL语句带'GO',会报'GO'附近有语法错误

     1 USE [ApiDB]
     2 GO
     3 
     4 SET ANSI_NULLS ON
     5 GO
     6 
     7 SET QUOTED_IDENTIFIER ON
     8 GO
     9 
    10 CREATE TABLE [dbo].[Test](
    11     [ID] [int] IDENTITY(1,1) NOT NULL,
    12     [Name] [nvarchar](50) NULL
    13  CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
    14 (
    15     [ID] ASC
    16 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    17 ) ON [PRIMARY]
    18 GO

    如上的建表语句,在SQL Server Management Studio管理工具中是可以执行的,然后本来想放在C#程序中直接执行,但是抛出:'GO'附近有语法错误,然后去查阅资料。

    SQL Server Management Studio管理工具属于客户端,它可以识别GO用来分批提交,但是'GO'不是SQL语句。它是可为osql,isql使用工具及SQL Server查询分析器识别的命令,SQL服务器不能识别所以不能用在程序中。

    如果确实要在程序中使用这些语句,只能在程序中启用一个事务,多条语句分别执行(去掉GO),所有语句执行完毕再提交事务。

    三、SQL中的BEGIN和END语句

    BEGIN和END语句用于将多个Transact-SQL语句组合为一个逻辑块。

    BEGIN单独一行,标志着语句块的开始,后面跟语句块,也就是多条T-SQL语句,然后END单独一行,标志着语句块结束。

    注:BEGIN和END必须一起使用

    BEGIN  
        { sql_statement | statement_block }   
    END  

    上面为语法。其实BEGIN和END相当于C#中的'{'和'}'。

    四、查询数据库中有没有某表,没有就创建

    if not exists(select * from sysobjects s where s.xtype = 'U' and s.name = '表名')
    begin 
        CREATE TABLE 表名
    end 

    其中sysobjects存储的是数据库中表相关的信息,xtype = 'U'代表所有类型为表的。

     五、SqlServer 新建自定义函数:使用指定字符分隔字符串(例:按照","将字符串分隔开)

     1 CREATE FUNCTION [dbo].[Fun_SplitStr]
     2 (
     3     @originalStr      VARCHAR(8000), --要分割的字符串
     4     @split varchar(100)              --分隔符号
     5 )
     6 RETURNS @temp TABLE(Result VARCHAR(100))
     7 AS
     8 BEGIN
     9     DECLARE @result AS VARCHAR(100);   --定义变量用于接收单个结果 
    10     
    11     SET @originalStr = @originalStr + @split ;  
    12       
    13     WHILE (@originalStr <> '')
    14     BEGIN
    15         SET @result = LEFT(@originalStr, CHARINDEX(@split, @originalStr, 1) -1) ;  
    16         
    17         INSERT @temp VALUES(@result) ;  
    18         
    19         --STUFF()函数用于删除指定长度的字符,并可以在指定的起点处插入另一组字符。
    20         SET @originalStr = STUFF(@originalStr, 1, CHARINDEX(@split, @originalStr, 1), '');
    21     END 
    22     RETURN
    23 END

    调用函数:

    select * from dbo.Fun_SplitStr('978,7,5007,7234,7',',')

    表值函数与表关联查询示例:

    SELECT
    o.*,
    sp.result productname
    FROM dbo.[order] o
    cross apply dbo.Fun_SplitStr(o.detailname,',') as sp
    WHERE o.DataValid = 20--数据校验成功

     六、Sqlserver按照a字段分组后合并b字段的值

    create table #temp(
    membercode nvarchar(100) null,
    orderdate datetime null,
    gifts nvarchar(100) null
    )
    
    insert into #temp values('ye', '2019-8-1', '筷子')
    insert into #temp values('ye', '2019-7-1', '戒指')
    insert into #temp values('ye', '2018-2-1', '手镯')
    
    select * from #temp
    
    select
    t.membercode,
    year(t.orderdate) years,
    cast(year(t.orderdate) as nvarchar(4)) + '' + stuff((select '' + gifts from #temp te 
                                where te.membercode = t.membercode 
                                and year(te.orderdate) = year(t.orderdate) 
                                for XML PATH('')),1,1,'') + '' year_gifts
    from #temp t
    where t.gifts is not null and t.gifts != ''
    group by t.membercode,year(t.orderdate)
    order by year(t.orderdate)

     七、sqlserver生成随机数

    注:在单个批处理中多次调用时,rand()返回相同的数字。

    批量生成随机数时使用:

    SELECT ABS(CHECKSUM(NewId())) % 99

    代表在1到99之间生成一个随机数。

  • 相关阅读:
    校园商铺-8商品模块-12接触商品与某商品类别的关联的实现
    centos 7访问windows共享文件夹
    怎样在CentOS 7.0上安装和配置VNC服务器
    【总结】教你怎么将centos7打造成桌面系统
    Centos 7安装gvim
    CentOS 7 安装virtualBox
    Centos 7中 vim 中文乱码
    CentOS 7 gedit编辑器中文乱码解决方法
    centos7支持ntfs
    delta
  • 原文地址:https://www.cnblogs.com/yezongjie/p/SQLPoints.html
Copyright © 2011-2022 走看看