如何按表名更改表行

时间:2015-08-28 14:20:33

标签: sql sql-server

我想编写一个sql脚本: 找到所有具有名为:sister的列的表 然后,在列姐妹的这些表中添加所有行+ *

例如,

家庭表:

brother sister mother
m        b       c
k         r     p

结果会将该表更改为

brother sister mother
m        b*      c
k         r*     p

如果有更多的表与姐妹列,它应该对他们这样做。 如果有更多表格的siter列,则不应触及它们。

非常感谢你的帮助

3 个答案:

答案 0 :(得分:0)

试试这个,

SELECT 'UPDATE ' + TABLE_NAME + ' SET ' + COLUMN_NAME
       + '= ' + COLUMN_NAME + '+''*'''
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  COLUMN_NAME = 'YOUR_COLUMN_NAME'
       AND TABLE_SCHEMA = 'YOUR_SCHEMA_NAME' 

答案 1 :(得分:0)

尽管我可以说,你需要使用动态SQL来实现这一目标。我不推荐这个。最好知道您更新哪些表而不是依赖数据库来了解。可能有一个表格,您不想要更新。

然而;以下代码将完成您查找名为" sister"的所有列的请求。在所有表上,并在存储在那里的值的末尾添加星号。我没有使用光标。我将UPDATE语句创建为单个事务。

-- Table variable to hold update statments:
declare @sqlUpdates table (
                           ID   int           not null identity(1,1)
                         , stmt nvarchar(max) not null
                          );

-- Populate all the update statements at once:
insert @sqlUpdates (stmt)
select 'update ['
     + schema_name(tables.schema_id)
     + '].['
     + tables.name
     + '] set sister = sister + ''*'''
  from sys.tables
  join sys.columns
    on columns.object_id = tables.object_id
 where columns.name = 'sister'

-- Loop throug & execute update statement
declare @min int = (select min(ID) from @sqlUpdates);
declare @stmt nvarchar(max);

while @min is not null
begin;

   -- Get the update statement from the table variable
   set @stmt = (select stmt from @sqlUpdates where ID = @min);

   -- execute the update:
   exec sp_executesql @stmt = @stmt;

   -- Increment the loop:
   set @min = (select min(ID) from @sqlUpdates where ID > @min)

end;

答案 2 :(得分:0)

万一你需要另一个选项在一个地方更改列名的灵活性

DECLARE @ColumnName VARCHAR(100) = 'sister'
DECLARE @TableName VARCHAR(200)
DECLARE @SQL VARCHAR(8000) 

DECLARE cur CURSOR FOR  
    SELECT '['+C.TABLE_SCHEMA+'].['+C.TABLE_NAME+']' FROM INFORMATION_SCHEMA.COLUMNS C
    INNER JOIN INFORMATION_SCHEMA.TABLES T ON C.TABLE_NAME = T.TABLE_NAME
    WHERE C.COLUMN_NAME LIKE @ColumnName 
    AND TABLE_TYPE = 'BASE TABLE'

OPEN cur
FETCH NEXT FROM cur INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN

    SET @SQL = 'UPDATE ' + @TableName + ' SET '+ @ColumnName +' = '+ @ColumnName + ' + ''*''' 

    EXEC sp_executesql @SQL;

    FETCH NEXT FROM cur INTO @TableName
END

CLOSE cur;
DEALLOCATE cur;