2010-01-05 157 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