SQL实用札记【SQL Sever篇】
目录
从表中去除重复行数据
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. 参考资料
- https://sqlperformance.com/2016/03/t-sql-queries/string-split
- http://stackoverflow.com/questions/5493510/turning-a-comma-separated-string-into-individual-rows
跨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)