2011-08-02 26 views
0

我有一个表,但我不知道它的列(我只知道它有“id(Uniqueidentifier)列”)。更新列名不明的表

我能得到的所有列在下面的查询表:

DECLARE @columnNames NVARCHAR(4000) = '' 

    SELECT @columnNames += '[' + COLUMN_NAME + '] ' 
    FROM INFORMATION_SCHEMA.Columns 
    WHERE TABLE_NAME = 'MY_TABLE' AND COLUMN_NAME NOT IN ('id') 
    ORDER BY COLUMN_NAME 

现在我想更新与另一个记录的数据的一个记录......

我怎样才能做到这一点?

感谢所有...

+3

不知道你打算使用的表的列名是一个非常糟糕的主意,可能源于糟糕的设计。 – Jacob

+0

我同意,但表是动态创建在不同的客户...我希望它是与2表一与数据和其他与字段名称等创建...但我不得不处理这个快速 – ogun

+1

你怎么知道哪列是哪些以及如何将这些值与其他值联系起来。 –

回答

1

这是怎么了,你可以建立一个动态的sql

DECLARE @columnNames NVARCHAR(4000) 
DECLARE @idfrom int, @idto int 
DECLARE @table nvarchar(50) 
SET @table = 'MY_TABLE' 
SET @idfrom = 5 -- id you are copying from 
SET @idto = 2 -- id you are copying to 

DECLARE @sqlstring nvarchar(max) 

SELECT @columnNames = coalesce(@columnNames, 'SET ') + '[' + COLUMN_NAME + ']=t2.' + '[' + COLUMN_NAME + '],' 
FROM INFORMATION_SCHEMA.Columns 
WHERE TABLE_NAME = @table AND COLUMN_NAME NOT IN ('id') 
ORDER BY COLUMN_NAME 

SET @sqlstring = 'update t1 ' +stuff(@columnNames, len(@columnNames),1,'') + ' 
FROM @t t1 
join @t t2 on t1.id =' + cast(@idto as varchar) + ' 
and t2.id = ' + cast(@idfrom as varchar) 

EXEC(@sqlstring) 
+0

谢谢队友......这真的很有帮助。 – ogun

0

我想你可以创建一个“插入到表1 ......从表2中选择..”型插入字符串,然后用sp_executesql的执行。

DECLARE @insertColumnNames NVARCHAR(4000) = '' 
DECLARE @selectColumnNames NVARCHAR(4000) = '' 

SELECT @insertcolumnNames += ',' + '[' + COLUMN_NAME + '] ' 
FROM INFORMATION_SCHEMA.Columns 
WHERE TABLE_NAME = 'TABLE_1' AND COLUMN_NAME NOT IN ('id') 
ORDER BY COLUMN_NAME 

SELECT @selectcolumnNames += ',' + '[' + COLUMN_NAME + '] ' 
FROM INFORMATION_SCHEMA.Columns 
WHERE TABLE_NAME = 'TABLE_2' AND COLUMN_NAME NOT IN ('id') 
ORDER BY COLUMN_NAME 

sp_executesql ('insert into TABLE_1 ('[email protected]+') select '+ @selectcolumnNames +' from TABLE_2'); 

我认为,类似这样的东西可以工作 (你将需要删除多余的,从列字符串,这是没有测试所有,只是一个想法)

+0

好主意,但我想更新我现有的数据...如果我使用插入语句,我必须删除现有数据... – ogun

+0

它可能更难但可以创建更新字符串插入,使用类似的方法。 –