我正在尝试找到一种方法,可以在多个数据库的表中找到重复的电子邮件地址。我有30个DB,都有一个“Users”表,字段相同(每个DB都是我们的不同客户)。我需要浏览每个数据库,从此表中获取电子邮件地址,然后搜索当前以及此电子邮件地址的所有其他数据库。如果存在,则写出记录,如果不存在,则转到下一个用户记录并重复。这是我到目前为止所得到的,但我被困住了。我想我必须在另一个游标中创建一个游标,但不知道它是否可以动态完成:
DECLARE @DBName varchar(20)
DECLARE @sSQL varchar(2000)
DECLARE LoopCursor CURSOR FOR
SELECT DBName
FROM Configuration
OPEN LoopCursor
FETCH NEXT FROM LoopCursor
INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sSQL = '
Select EmailAddress
FROM ' + @DBName + '.dbo.Users'
--Not to sure what to do from here??
EXEC(@sSQL)
FETCH NEXT FROM LoopCursor
INTO @DBName
END
CLOSE LoopCursor
DEALLOCATE LoopCursor
SELECT 'DONE'
我们正在使用SQL Server 2008 R2 btw。
答案 0 :(得分:1)
未经测试,但类似这样的内容应将它们全部转储到您放入db.schema.DuplicateEmailAddresses
Declare @DBName varchar(20)
Declare @sql nvarchar(max)
Declare @join nvarchar(max) = ''
Declare LoopCursor Cursor For
Select DBName
From Configuration
Set @sql = N'Select EmailAddress Into db.schema.DuplicateEmailAddresses From ('
Open LoopCursor
Fetch Next From LoopCursor Into @DBName
While @@FETCH_STATUS = 0
Begin
Set @sql = @sql + @join + N'Select EmailAddress From ' + QuoteName(@DBName) + N'.dbo.Users'
Set @join = N' Union All '
Fetch Next From LoopCursor Into @DBName
End
Close LoopCursor
Deallocate LoopCursor
Set @sql = @sql + N') as tmp Group By EmailAddress Having Count(*) > 1'
exec sp_executesql @sql, N''