目錄
- 從表中去除重複行
- 逗號分隔字符串轉數據錶行
- 跨DB/Server執行SP[分佈式事務]
- 在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
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)