这是将在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表替换DB1表中的列和DB2表列数据。当我在sql server代理上作为一个作业运行它时,这很好。
我想运行相同的查询来更改具有相同列的更多数据库。所以FROM查询我想添加更多数据库,如From DB1.table,DB2.table,DB3.table ......
没有光标它不起作用,因为它会像这样重复更新后的值。
column1
tom
tom
tom
答案 0 :(得分: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)。
答案 1 :(得分:0)
停止使用游标并编写三个基于集合的更新语句。它将减少代码并运行得更快。