【问题标题】:sql server insert copy rows multiple tables one field changingsql server 插入复制行多个表一个字段更改
【发布时间】:2014-02-26 10:27:11
【问题描述】:

我不确定问这个问题的最佳方法,所以我会通过示例来提问。

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

现在,我想我可以用一个足够简单的表来做到这一点,比如:

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 个表中的每一个手动创建所有字段的列表?

-- 谢谢。

【问题讨论】:

  • * 怎么样? 'SELECT 'new value' as department, * INTO myTable FROM myTable WHERE department = 'old value';'
  • 这是我开始的地方,但很快发现它尝试将 deprtment 字段两次放入表中并收到此错误:S0021(2705)[Microsoft][ODBC SQL Server Driver][SQL Server ]每个表中的列名必须是唯一的

标签: sql sql-server


【解决方案1】:

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 中的文本输出并运行查询。中提琴。

【讨论】:

  • 这似乎真的很接近我的需要,但不幸的是我没有通过 SSMS 工作,所以我正在研究可以在我的界面中工作的类似东西 - 你给我的关键是如何使用information_schema.tables。我想我可以让它发挥作用。
  • @Russted 您可以从不需要 SSMS 的任何连接中运行它。 sp_MSForeachTable 未绑定到 SSMS。您可以将其作为命令运行并执行返回的每个字符串。
【解决方案2】:

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

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 + ''';'

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
相关资源
最近更新 更多