sql server插入复制行多个表一个字段更改

时间:2014-02-25 22:38:55

标签: sql sql-server

我不确定问这个的最佳方式,所以它将通过例子。

我有一个大小合适的数据库,其中包含大约800个表,每个表包含所有数据的关键信息 - 例如,我们称之为Department。这是这些表的唯一索引的一部分。我需要一个进程来遍历每个表,并将当前在一个部门中的所有行复制到一个新的行集中,用于新添加的部门。

现在,我想我可以用一个简单的表来完成这个,例如:

SELECT 'new value' as department, field2, field3, field4, field5 
INTO myTable
FROM myTable
WHERE department = 'old value';

但是,我试图找到一个懒惰的方法,而不必列出表的所有字段(一些表有一个大的字段列表)。我希望找到一个可以在每个表上使用的简单语句,并产生相同的结果,而不必列出所有字段(只有在新行中更改的字段)。基本上就像我的第一个声明一样简单 - 除了不必在表格中拉出所有数千个字段名称之外:

SELECT 'new value' as department, (magically get all other fields for the specified row in the table)
INTO myTable
FROM myTable
WHERE department = 'old value';

有没有人曾经做过这样的事情?我不得不手动为800个表中的每个表创建所有字段的列表吗?

- 谢谢。

2 个答案:

答案 0 :(得分:0)

使用sp_MSforEachtableINFORMATIONSCHEMA表一起创建如下的查询:

EXEC sp_MSforeachtable  'DECLARE @Chars VARCHAR(MAX)

SELECT @Chars = ISNULL(@Chars + '', '' +COLUMN_NAME, COLUMN_NAME)   
FROM INFORMATION_SCHEMA.TABLES TAB
INNER JOIN INFORMATION_SCHEMA.COLUMNS COL
ON TAB.TABLE_NAME = COL.TABLE_NAME
AND TAB.TABLE_SCHEMA = COL.TABLE_SCHEMA
WHERE TAB.TABLE_NAME =PARSENAME(''?'',1)

SELECT ''SELECT ''''newvalue'''' as department, ''+@Chars+''  INTO ? FROM ? WHERE department =''''old_value'''''''

将结果切换到SSMS中的文本输出并运行查询。中提琴。

答案 1 :(得分:0)

这是你能做到的另一种方式:

Declare @table sysname = 'myTable', @field sysname = 'department', 
        @oldValue nvarchar(max) = 'old value', @newValue nvarchar(max) = 'new value'

Declare @colNames nvarchar(max)

Select @colNames = COALESCE(@colNames + ', ', '') + QUOTENAME(Name)
From syscolumns 
Where id = OBJECT_ID(@table)
And name <> @field
Order by colid

Print 'SELECT ''' + @newValue + ''' as ' + QUOTENAME(@field) + ', ' + @colNames +
' INTO ' + QUOTENAME(@table) +
' FROM ' + QUOTENAME(@table) +
' WHERE ' + QUOTENAME(@field) + ' = ''' + @oldValue + ''';'