2013-08-22 74 views
0

這是數據的一個例子,將在列11個步驟SQL作業多個查詢

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 

我創建了這個代碼,它使用DB2表列數據替換DB1表中的列。當我將它作爲sql server代理上的一個工作運行時,這工作正常。

我想要運行相同的查詢來更改具有相同列的更多數據庫。因此FROM查詢我想添加更多數據庫,如From DB1.table,DB2.table,DB3.table ...

沒有遊標,它不起作用,因爲它在更新後複製了像這樣的值。

column1 
tom 
tom 
tom 
+1

首先,你永遠不應該在遊標中做一個更新,使用一個基於集合的操作,閱讀:http:// wiki。 lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM

+0

在另一個數據庫中是db1.table而不是db2.table,或者它是否具有名稱空間db1,另一個是否具有名稱空間db2? – Archlight

+0

它們是不同的數據庫 – MohammedT

回答

0

1DO你希望儘量減少文字量你寫的,你可以做這樣的

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)。

+0

這個問題是,它無線不會遍歷DB2表中的所有行,因此它將傳遞1個名稱並將其複製到每個數據庫中。 – MohammedT

+0

我測試了它,它將一個名稱複製到所有數據庫中。其他解決方案? – MohammedT

+0

是的,我已經更新了我的答案。這應該得到你想要的,但它有點像你的原始問題,但它不依賴於光標 – Archlight

0

停止使用遊標並寫三個基於集合的更新語句,代碼更少,運行速度更快

+0

我測試了它,並且它在我使用時將一個名稱複製到所有數據庫中代碼: 'update DB1.table set Column1 =(select new())從DB2.table order by newid()中選擇top(1)Column2其中Column1不爲空' 'update DB2.table set Column1 =(select top )來自DB2.table的Column2由newid()定購)其中Column1不爲空' 'update DB3.table set Column1 =(從newid()中的DB2.table order中選擇top(1)Column2)其中Column1是no t null' 任何其他解決方案? – MohammedT

+0

也許你會向我們展示一些表格中的sample dat和預期的結果。 – HLGEM

+0

剛剛更新了我的問題 – MohammedT