2010-01-05 102 views
0

在表中有113列。並且表中有兩個默認記錄,一個是未知的,另一個是不適用的。因此,每列都有自己的默認值來表示未知和不適用。用光標插入語句

我不想寫定期插入語句來獲得這兩個記錄。

所以,我試圖插入每列使用遊標。

從INFORMATION_SCHEMA.COLUMNS得到了該表的列名,並試圖使用「插入選擇」語句的另一個位置插入來自確切的表值,但我們從INFORMATION_SCHEMA獲取列的名稱

Declare @col_name varchar(50) 

declare my_cur CURSOR for 
    select column_name from information_schema.columns 
    where table_name = 'tabl' and table_catalog = 'db' 
    and table_schema = 'dbo' 


    Fetch next from my_cur 
    into @col_name 

    while @@FETCH_STATUS = 0 
    BEGIN 

    Insert into db.dbo.tabl (***@col_name***) 
    select ***@col_name*** from openrowset('sqlncli', 'server=my_server;   trusted_connection=yes;', db.dbo.tabl) 



    fetch next from my_cur into @col_name 
    end 

close my_cur 
deallocate my_cur 
go 

但是,我並沒有意識到,@col_name將被視爲字符串,而不是對象(列)

是否有這種情況或任何替代解決方案的任何解決辦法。

+5

您是否將數據庫設計留給了前臺的祕書? – ChaosPandion 2010-01-05 20:26:45

+0

該表是數據倉庫中的維度表。所以,不能抱怨。 – 2010-01-05 20:33:03

+1

「在表格中有113列」... 我認爲你應該在那裏停下來,按照其他人的建議,並重新考慮你的設計。 – Tesserex 2010-01-05 20:45:22

回答

1

你將不得不產生INSERT語句作爲動態SQL,然後執行它

Declare @InsertStatement VarChar (Max) 

SET @InsertStatement = '' 

SET @InsertStatement = @InsertStatement + ' Insert into db.dbo.tabl (' + @col_name + ') ' 
SET @InsertStatement = @InsertStatement + ' select ' + @col_name + ' from openrowset(''sqlncli'', ''server=my_server''; ' 

Exec Sp_SQLExec @InsertStatement 
5

我認爲,讓這些默認值填充是至少你的問題。

我建議採取看看這個:Fundamentals of Relational Database Design

如果你仍然想這樣做,它可能是更好的檢索所有的從鏈接服務器的默認設置,將它們放置在一個臨時表,然後加入到information_schema.columns來填充你的表格。您可能需要轉置數據才能使其工作。

+2

是的,那裏有很強烈的暗示,113列與值不相關的是一點設計FLAW – ErikE 2010-01-05 20:39:18

+0

我肯定會告訴我的開發人員重新考慮他們的設計。但是,我想大家知道它是數據倉庫中的維度表。 – 2010-01-06 15:21:56

+0

啊,這可能會改變一些事情。但是你提出的表結構是什麼樣的?看起來像你發佈的光標會給你113行,每行都有一列(113)填充。你打算以某種方式將它轉變成一個更有用的結構? – AlexCuse 2010-01-06 16:15:03