我想编写一个sql脚本: 找到所有具有名为:sister的列的表 然后,在列姐妹的这些表中添加所有行+ *
例如,家庭表:
brother sister mother
m b c
k r p
结果会将该表更改为
brother sister mother
m b* c
k r* p
如果有更多的表与姐妹列,它应该对他们这样做。 如果有更多表格的siter列,则不应触及它们。
非常感谢你的帮助
答案 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;