2016-01-19 25 views
1

我的問題是:我需要選擇其中包含一列NrPad我的數據庫和正是這個表我需要更新列NrPadSQL更新

我已經我所有的DB-表一個工作選擇和更新聲明:

select 
    t.name as table_name 
from sys.tables t 
inner join sys.columns c 
on t.object_id = c.object_id 
where c.name like 'NrPad' 

Update Anlage Set NrPad = CASE WHEN Len(Nr) < 10 THEN '0' + Convert(Nvarchar,Len(Nr)) ELSE Convert(Nvarchar,Len(Nr)) END + Nr 

我的問題是:我怎樣才能合併這兩個聲明?

我很樂意接受您的建議和幫助,非常感謝。

+0

你沒有說你正在使用什麼dbms,如果它的oracle比你的問題中的答案更好,你可以使用MERGE語句來更新另一個表的表或者在你的情況下選擇 – sagi

+0

更新所有表中的'NrPad'添加另一個'0'?您需要一個遊標並使用動態SQL創建UPDATE。 – dnoeth

+0

像dnoeth說光標是唯一的解決方案,oracle merge語句只是由另一個表更新不更新多個表 –

回答

0

使用INFORMATION_SCHEMA而非sys.tables,並創建一個動態SQL語句,像這樣:

DECLARE @sql varchar(max) = ''; 

SELECT 
    @sql = @sql + '; UPDATE ' + c.TABLE_NAME + ' SET NrPAd = CASE WHEN LEN(Nr)<10 THEN ''0'' + CONVERT(NVARCHAR,LEN(NR)) ELSE CONVERT(NVARCHAR,LEN(NR)) END + Nr' 
FROM INFORMATION_SCHEMA.COLUMNS c 
where c.COLUMN_NAME = 'NrPad' 


print @sql -- for debugging purposes 
exec (@sql) 

這個假設是有NrPad列中的所有表也有Nr列。如果您需要檢查這些信息,或者只需要使用特定表格中的Nr列,則會有所不同(請再次參考INFORMATION_SCHEMA.COLUMNS或與Anglage聯繫以獲取Nr的值或檢查Nr是否爲列該表)。

+0

謝謝,這工作完全一樣,它應該是! – KatharinaG

+0

沒有問題 - 如果你發現這很有幫助,請考慮將其標記爲接受的答案(投票搖桿下的檢查)。 –

0

也許有人會批評我,但我可以爲這種情況下,做的是光標

DECLARE @table_name varchar(100) 
    DECLARE @sql varchar(1000) 
    DECLARE table_cursor CURSOR FOR 
    select 
     t.name as table_name 
    from sys.tables t 
    inner join sys.columns c 
      on t.object_id = c.object_id 
      where c.name like 'NrPad' 
    OPEN table_cursor 
    Fetch next From table_cursor Into @table_name 
    While @@fetch_status=0  
    Begin 
    set @sql = 'Update' + @table_name + 'Set NrPad = CASE WHEN Len(Nr) < 10 THEN '0' + Convert(Nvarchar,Len(Nr)) 
         ELSE Convert(Nvarchar,Len(Nr)) END + Nr' 
    EXEC (@sql) 
    Fetch Next From table_cursor Into @table_name 
    End 
    Close table_cursor 
    Deallocate table_cursor 

你這是怎麼寫的光標SQLSERVER,我真的不希望Oracle的代碼是另一個。所以請標記下次使用的dbms

+0

對不起,我完全忘記了我正在使用的dbms - 它是Microsoft SQLServer 2014.感謝您使用光標。唯一的問題是,我不能使用表名作爲變量(對嗎?)。我試過你的解決方案,唯一的問題是在UPDATE之後的@table_name「必須聲明表變量」@table_name「。 – KatharinaG

+0

哦,這是我的不好使用動態SQL,我編輯答案並測試它,它會沒事的。可以再試一次@ user1474960 –

+0

謝謝你的更新 - 它工作正常 – KatharinaG

0

您可以修改select語句以生成更新語句,然後全部執行它們。

下面使用Oracle的字符串字面值。

select 'Update ' || t.name || q'[ Set NrPad = CASE WHEN Len(Nr) < 10 THEN '0' + Convert(Nvarchar,Len(Nr)) ELSE Convert(Nvarchar,Len(Nr)) END + Nr;]' 
from sys.tables t 
inner join sys.columns c 
on t.object_id = c.object_id 
where c.name like 'NrPad'