更新具有相同名称的不同模式的表

时间:2010-07-28 22:57:02

标签: sql sql-server tsql

使用SQL Server和T-SQL,如何在同一数据库下更新具有特定名称但不同模式的所有表格表?

:更新:

更新包括添加/删除/修改列以及更改行的特定值。

我希望能够跨所有架构部署对表的更改。使用SQL Server Management Studio表设计器,当我进行更改和保存时,它允许我保存可用于将这些更改部署到不同表的脚本。我希望能够在所有模式中具有该特定名称的所有表上使用该脚本。

:更新2:

这个请求的原因是我想确保跨多个模式更新特定表很容易。在将来,我的应用程序无疑会发生变化,如果我发现更新模式很困难或效率低下,那么我会选择使用其他东西。

以下是我的尝试:

DECLARE @update_sql NVARCHAR(max)
DECLARE @table_name VARCHAR(45)

DECLARE c_tables CURSOR FOR
  SELECT t.table_name
    FROM INFORMATION_SCHEMA.TABLES t
   WHERE t.table_name = 'TestTable'
     AND t.table_catalog = 'MyDataBase'

OPEN c_tables
FETCH c_tables INTO @table_name

WHILE @@Fetch_Status = 0
BEGIN

  SET @update_sql = N'ALTER TABLE '+@table_name+' ADD ColumnThree nvarchar(50) NULL'
  EXEC sp_executesql @update_sql

END

CLOSE c_tables
DEALLOCATE c_tables

运行此命令会产生以下错误:

  

无法找到对象“TestTable”,因为它不存在或您没有权限。

该表存在,我正在dbo下运行,这是架构所有者。

我还注意到,即使数据库中只有7个表,并且在这些表上使用了3个模式,查询也需要一段时间才能运行。使用每个模式的所有者登录并运行通用脚本会更有效吗?每个架构所有者只能访问其各自的架构和表。

2 个答案:

答案 0 :(得分:4)

在SQL Server 2005+上,您可以使用INFORMATION_SCHEMA.TABLES获取数据库中的表列表:

SELECT t.table_name,
       t.table_schema
  FROM INFORMATION_SCHEMA.TABLES t
 WHERE t.table_name = 'Table_1'
   AND t.table_catalog = 'your_database'

但是您没有指定您需要的更新 - DML或DDL ......

更新

DECLARE @update_sql NVARCHAR(max)
DECLARE @table_name VARCHAR(45)

DECLARE c_tables CURSOR FOR
  SELECT t.table_name
    FROM INFORMATION_SCHEMA.TABLES t
   WHERE t.table_name = 'Table_1'
     AND t.table_catalog = 'your_database'

OPEN c_tables
FETCH c_tables INTO @table_name

WHILE @@Fetch_Status = 0
BEGIN

  SET @update_sql = N'UPDATE @table_name SET ...'
  EXEC sp_executesql @update_sql

  SET @update_sql = N'ALTER TABLE @table_name ...'
  EXEC sp_executesql @update_sql

END

CLOSE c_tables
DEALLOCATE c_tables

答案 1 :(得分:3)

如果所有操作都相同,您可以使用sp_MSforeachtable(我显然首先将一些非常强大的错误处理和回滚功能放入脚本中)

exec sp_MSforeachtable 
   '
    if parsename(''?'',1) = ''TargetTableName''
    begin
    update ? set ColumnToUpdate=NewValue;

    execute sp_rename N''?.newname'', N''obsoletename'', ''column'' ;

    alter table ? add newcol int null;

    alter table ? drop column oldcol;
    end'
相关问题