从表名中删除用户名

时间:2013-07-22 13:40:41

标签: sql-server sql-server-2005 database-schema

我在服务器故障后恢复了数据库,现在我遇到了一个问题,表名显示为database_user_name.table_name。所以当我查询类似的东西时:

select * from contacts

它不起作用,因为它期望它是完全合格的,如:

select * from user1000.contacts

这个问题是我有数百个存储过程用它们的名称引用表,因此没有任何查询可以工作。

有没有办法告诉SQL Server 2005从表中删除用户名而不将用户更改为所有者?

2 个答案:

答案 0 :(得分:2)

尝试manual

的建议
  

要使用SQL Server Management Studio更改表或视图的架构,请在对象资源管理器中右键单击该表或视图,然后单击“设计”。按F4打开“属性”窗口。在“架构”框中,选择一个新架构。

答案 1 :(得分:1)

如果您确定dbo架构中不存在任何表,那么您可以说:

ALTER SCHEMA dbo TRANSFER user1000.contacts;

要为该架构中的所有表生成一组脚本,您可以说:

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'';

SELECT @sql = @sql + N'
  ALTER SCHEMA dbo TRANSFER user1000.' + QUOTENAME(name) + ';'
  FROM sys.tables
  WHERE SCHEMA_NAME([schema_id]) = N'user1000';

PRINT @sql;
--EXEC sp_executesql @sql;

(一旦您对PRINT输出感到满意 - 确认它将在8K被截断,即使该变量确实包含整个脚本 - 取消注释EXEC并再次运行它。不检查潜在的冲突。)

但真正的解决方法是修复你的代码。你永远不应该说select * from contacts - 由于各种原因,*和the missing schema prefix都可能有问题。