我不确定问这个的最佳方式,所以它将通过例子。
我有一个大小合适的数据库,其中包含大约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个表中的每个表创建所有字段的列表吗?
- 谢谢。
答案 0 :(得分:0)
使用sp_MSforEachtable
和INFORMATIONSCHEMA
表一起创建如下的查询:
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 + ''';'