sql-server - 更新 SQL Server 中具有列名的所有表中的值
问题描述
我正在编写一个存储过程,它需要在数据库中搜索具有特定列名的所有表。获得包含该列的表列表后,我需要更新该列中的值。所以首先我得到一个具有特定列的表列表。
SELECT c.name AS 'ColumnName'
,t.name AS 'TableName'
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE 'company'
ORDER BY TableName
现在我有了需要更新的表的列表,我需要运行类似于以下内容的查询来更新每个表中的数据。
update table1 set company = @newValue where company = @oldvalue
我不知道如何去写这部分。我的第一个想法是在游标内编写一个动态更新语句,例如:
Declare @newValue
Declare @oldValue
SET @companyCursor = CURSOR FOR
SELECT t.name AS 'TableName'
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE 'company'
OPEN @companyCursor;
FETCH NEXT FROM @companyCursor INTO @tableName;
WHILE @@FETCH_STATUS = 0
BEGIN
update @tableName set company = @newValue where company = @oldValue
FETCH NEXT FROM @companyCursor INTO INTO @tableName;
END
这是一个好策略吗?
解决方案
不,最后的更新将不起作用。您需要像这样使用 exec (@sql):
declare @sql varchar(4000)
begin
set @sql = 'update ' + @tableName + 'set company = ' + @newValue + 'where company = ' + @oldValue
exec (@sql)
fetch next ...
end
这假设 @newvalue 和 @oldvalue 在某处被赋值。
推荐阅读
- excel - 如何在 vlookup 不起作用的 excel 范围内拉出最近的字符串?
- flutter - Flutter 在播放前缓存视频在 Futurebuild 上为空
- c - 如何从 Char 中仅读取 Int
- android - 将 compose 添加到 buildFeatures 会产生 NoSuchMethodError
- neo4j - Apoc.merge.relationship() 在 Neo4j 中创建重复项
- spring-webflux - Mono 类型中的方法 flatMap()
- html - 盒子的最后一部分(底部)
- vue.js - 如何让 Switch/Case 只查看特定断点?
- linkedin - 审核进度未变
- javascript - Chrome/Firefox 扩展:尝试在突出显示的文本上创建一个弹出窗口,但弹出窗口被推离屏幕