使用SQL Server和T-SQL,如何在同一数据库下更新具有特定名称但不同模式的所有表格表?
更新包括添加/删除/修改列以及更改行的特定值。
我希望能够跨所有架构部署对表的更改。使用SQL Server Management Studio表设计器,当我进行更改和保存时,它允许我保存可用于将这些更改部署到不同表的脚本。我希望能够在所有模式中具有该特定名称的所有表上使用该脚本。
这个请求的原因是我想确保跨多个模式更新特定表很容易。在将来,我的应用程序无疑会发生变化,如果我发现更新模式很困难或效率低下,那么我会选择使用其他东西。
以下是我的尝试:
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个模式,查询也需要一段时间才能运行。使用每个模式的所有者登录并运行通用脚本会更有效吗?每个架构所有者只能访问其各自的架构和表。
答案 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'