0

这是将在 column1 中的数据示例

Column1
Test1
test2
test3

然后我运行这个查询

Declare @Id uniqueidentifier
DECLARE db_cursor CURSOR FOR  
SELECT Id 
FROM DB1.table 
WHERE Column1 is not null
OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @id   

WHILE @@FETCH_STATUS = 0   
BEGIN   
    update DB1.table 
    set Column1 = (select top(1) Column2 from DB2.table order by newid())
    where Id = @id

   FETCH NEXT FROM db_cursor INTO @id   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

这是我得到的输出

Column1
tom
jack
bob

我创建了这段代码,它将 DB1 表中的列替换为 DB2 表列数据。当我在 sql server 代理上将其作为作业运行时,这可以正常工作。

我想运行相同的查询来更改具有相同列的更多数据库。所以 FROM 查询我想添加更多的数据库,如 From DB1.table、DB2.table、DB3.table...

没有游标它就无法工作,因为它会像这样在更新后复制值。

column1
tom
tom
tom
4

2 回答 2

0

停止使用游标并编写三个基于集合的更新语句。它的代码更少,运行速度也更快。

于 2013-08-22T12:34:13.320 回答
0

1你想尽量减少你写的文字你可以这样做

update DB1.table set Column1 = (select top(1) Column2 from DB2.table order by newid()) where Column1 is not null
update DB2.table set Column1 = (select top(1) Column2 from DB2.table order by newid()) where Column1 is not null
update DB3.table set Column1 = (select top(1) Column2 from DB2.table order by newid()) where Column1 is not null

使用游标通常不是最好的做法。

对不起这个错误。正确的是,这只会导致所有更新的同一行。

    update  DB1..[Table] set Column1 =randomizedCol
    from DB1..[Table] inner join 
    (
        select id,randomizedCol from 
            (select id, row_number() over (order by id) as col1RowNr from  DB1..[Table] ) as level41 inner join 
            (select column2 as randomizedCol,row_number() over (order by newId()) as col2RowNr from  DB2..[Table]) as level42
        on col1rowNr = col2RowNr
    ) as randomizedOutput
    on randomizedOutput.id =  DB1..[Table].id

这会让你得到你想要的,而且速度更快。然后你复制这个 3 次 :( 对于你想为每个数据库执行这个操作。如果你有很多数据库,你可以把它放到一个字符串中并使用 exec(@sqlString) 。

于 2013-08-22T12:09:06.820 回答