代码之家  ›  专栏  ›  技术社区  ›  Omar

用不同的模式更新同名表

  •  1
  • Omar  · 技术社区  · 15 年前

    使用SQLServer和T-SQL,如何更新同一数据库下具有特定名称但架构不同的所有表?

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

    :更新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 它是架构所有者。

    2 回复  |  直到 15 年前
        1
  •  4
  •   OMG Ponies    15 年前

    在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
    
        2
  •  3
  •   Martin Smith    15 年前

    你可以用 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'