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 サーバー エージェントでジョブとして実行すると正常に動作します。

同じクエリを実行して、同じ列を持つデータベースをさらに変更したいと考えています。したがって、FROM クエリには、From DB1.table、DB2.table、DB3.table などのデータベースをさらに追加したいと考えています。

このように更新後に値を複製するため、カーソルがないと機能しません。

column1
tom
tom
tom
4

2 に答える 2

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 に答える