Sql Job多步查询1步

时间:2013-08-22 11:55:56

标签: sql-server

这是将在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

2 个答案:

答案 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)

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