zoukankan      html  css  js  c++  java
  • SQL实用札记【SQL Sever篇】

    目录

    1. 从表中去除重复行
    2. 逗号分隔字符串转数据表行
    3. 跨DB/Server执行SP[分布式事务]
    4. 在OpenQuery中执行带参数的SQL语句

    从表中去除重复行数据

    1. 如果有ID字段,就是具有唯一性的字段 
     -- group  by  子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。
     delete   table  tableName 
     where   id   not   in   (   select   max(id)   from   table   group   by   col1,col2,col3...   )
    2. 如果是判断所有字段也可以这样  ,【对于表中的指定的字段的进行检查是否相同】
    select   *   into   #temp  from   tablename    group   by   id1,id2,....    
    delete    tablename      
    insert   into   table  select   *   from   #temp 
    drop   table   #temp
    
    3. 首先去重复,再获取N*1条数据插入到临时表中,【对于表中的所有字段的进行检查是否相同】,再将原表的数据删除,然后将临时表的数据插入到原表,最后删除临时表。
    select   distinct   *   into   #temp   from   tablename      
    delete   tablename      
    go    
    insert   tablename   select   *   from   #temp    
    go    
    drop   table   #temp
    
    4. 没有ID的情况
    select   identity(int,1,1)   as   id,*   into   #temp   from   tabel    
    delect   #   where   id   not   in   (    
    select   max(id)   from   #   group   by   col1,col2,col3...)    
    delect   table    
    inset   into   table(...)    
    select   .....   from   #temp
    
    5. col1+','+col2+','...col5 联合主键
    select * from table where col1+','+col2+','...col5 in (
    select max(col1+','+col2+','...col5) from table
    where having count(*)>1
    group by col1,col2,col3,col4
    )
    -- group   by   子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。  
     6. 使用自增列
    select   identity(int,1,1)   as   id,*   into   #temp   from   tabel     
    select   *   from     #temp   where   id   in   (     
    select   max(id)   from   #emp   where   having   count(*)>1   group   by   col1,col2,col3...)     

    逗号分隔字符串转数据表行

    1. 使用CHARINDEX和SUBSTRING函数
    CREATE FUNCTION dbo.splitstring
        (
          @stringToSplit VARCHAR(MAX)
        )
    RETURNS @returnList TABLE ( [Name] [nvarchar](500) )
    AS 
        BEGIN
     
            DECLARE @name NVARCHAR(255)
            DECLARE @pos INT
     
            WHILE CHARINDEX(',', @stringToSplit) > 0 
                BEGIN
                    SELECT  @pos = CHARINDEX(',', @stringToSplit) 
                    SELECT  @name = SUBSTRING(@stringToSplit, 1, @pos - 1)
     
                    INSERT  INTO @returnList
                            SELECT  @name
     
                    SELECT  @stringToSplit = SUBSTRING(@stringToSplit, @pos + 1,
                                                       LEN(@stringToSplit) - @pos)
                END
     
            INSERT  INTO @returnList
                    SELECT  @stringToSplit
     
            RETURN
        END
    
    2. 使用XML-Method[SQL Server 2005+]
    CREATE FUNCTION [dbo].[ufnGetSplitValues]
        (
          @StringValues NVARCHAR(4000),
          @Delimiter CHAR(1)
        )
    RETURNS TABLE
    AS
    RETURN
        (
            SELECT LTRIM(RTRIM(Split.a.value('.', 'NVARCHAR(100)'))) 'Value'
            FROM 
            (    
                 SELECT CAST ('<M>' + REPLACE(@StringValues, @Delimiter, '</M><M>') + '</M>' AS XML) AS Data           
            ) AS A
            CROSS APPLY Data.nodes ('/M') AS Split(a)  
        )
    GO
    
    3. STRING_SPLIT()函数[SQL Server 2016 +]
    SELECT * FROM STRING_SPLIT('a,b,cd', ',');
     
    /* result:
     
        value
        --------
        a
        b
        cd
    */  
    4. 参考资料

    跨DB/Server执行SP[分布式事务]

    USE Database1
    GO
    
    -- 如果不加SET FMTONLY OFF,在执行时可能会出现分布式事务异常
    SELECT name, age, sex INTO #Persons FROM OPENQUERY(LinkedServer,
     'SET FMTONLY OFF  EXEC [database2].[dbo].uspGetPersonList')
    

    在OpenQuery中执行带参数的SQL语句

    DECLARE @Sql VARCHAR(1000)
    DECLARE @organizationID VARCHAR(10)
    SELECT @organizationID = (SELECT ORGANIZATION_ID FROM MYORGS WHERE ORGANIZATION_NAME = 'MMT')
    SET @Sql = 'SELECT * from tableName where organization_id ='+@organizationID
    SET @Sql = 'SELECT * FROM OPENQUERY(LinkedServerName, ''' + REPLACE(@Sql, '''', '''''') + ''')'
    EXEC(@Sql)
    

      

  • 相关阅读:
    九校联考-DL24凉心模拟Day2T2 整除(division)
    九校联考-DL24凉心模拟Day1T3 三米诺 (tromino)
    九校联考-DL24凉心模拟总结
    异常 日志-<多重catch语句>
    时间和日期实例-<Calender计算出生日期相差几天>
    时间和日期-<Date和SimpleDateFormat>
    实用类-<Math类常用>
    实用类-<字符串与基本类型的转换>
    实用类-<装箱与拆箱>
    HashMap的应用
  • 原文地址:https://www.cnblogs.com/EasonWu/p/6732328.html
Copyright © 2011-2022 走看看