惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Blog — PlanetScale
Blog — PlanetScale
aimingoo的专栏
aimingoo的专栏
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
F
Fortinet All Blogs
C
CERT Recently Published Vulnerability Notes
Spread Privacy
Spread Privacy
月光博客
月光博客
L
LINUX DO - 热门话题
C
Cisco Blogs
P
Proofpoint News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
爱范儿
爱范儿
B
Blog
P
Privacy International News Feed
Know Your Adversary
Know Your Adversary
The Cloudflare Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cyberwarzone
Cyberwarzone
J
Java Code Geeks
罗磊的独立博客
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cisco Talos Blog
Cisco Talos Blog
T
Tor Project blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 司徒正美
酷 壳 – CoolShell
酷 壳 – CoolShell
Simon Willison's Weblog
Simon Willison's Weblog
量子位
H
Help Net Security
The Register - Security
The Register - Security
L
LangChain Blog
GbyAI
GbyAI
Vercel News
Vercel News
S
Schneier on Security
T
Threatpost
T
Threat Research - Cisco Blogs
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog
MongoDB | Blog
MongoDB | Blog
Recorded Future
Recorded Future
G
GRAHAM CLULEY
MyScale Blog
MyScale Blog

博客园 - 光脚码农

CentOS安装JDK CentOS 7中安装和配置Promethues - 光脚码农 - 博客园 查看和指定SpringBoot内嵌Tomcat的版本 - 光脚码农 - 博客园 CentOS中安装Azkaban 2.5 Centos7 安装Nodejs SpringBoot实用技巧札记 话说静态构造函数 如何利用正则表达式匹配花括号内的内容 如何为Windows Forms应用程序添加启动参数(Start-Up Parameters) 利用存储过程来重命名SQL Server数据库 .NET批量操作窗口样式 ViewData、ViewBag、TempData、Session的区别与联系 如何为自己的网页实现一个“回到顶部”的链接? 如何获得数据库中所有用户创建的索引 如何为一个类型为Color的属性设置默认值 用BCP从SQL Server 数据库中导出Excel文件 DataGridView如何绑定DataRow对象集合 Const vs. Readonly Windows下Git的安装与配置(Cygwin)
SQL实用札记【SQL Sever篇】
光脚码农 · 2017-04-19 · via 博客园 - 光脚码农

目录

  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)