使用sql脚本中的数据库名称获取完整的表名

时间:2011-11-07 10:38:46

标签: sql sql-server database tsql

我在一段时间内遇到了一个bug,然后在数据库存储过程代码中找到了它的原因,该代码包含表名中数据库的旧名称,而当前数据库名称已经不同了。所以,我想问一下:

是否存在使用数据库名称作为完整表名称(数据库名称+模式名称+表名称)的一部分的情况(如果我们不这样做)触摸其他数据库中的表)或者它总是一个不好的做法?如何在sql脚本中正确使用数据库名称以保持代码与特定数据库无关?

代码仅用于说明:

CREATE PROCEDURE [dbo].[MyProc] 
AS
BEGIN
 DELETE FROM [MyDatabase].[dbo].[MyTable] 
END

3 个答案:

答案 0 :(得分:2)

不,除非需要处理两个数据库,否则不应在存储过程中使用数据库名称。

它会导致您看到的各种错误。当数据库名称更改时,所有SP代码都会中断或继续工作,但在旧数据库上。

如果要向数据库发送SQL查询,但仅当应用程序动态选择要插入查询的数据库名称时才有意义。

我的建议是您完全导出数据库模式,并搜索硬编码的数据库名称并将其删除。

答案 1 :(得分:0)

这实际上取决于脚本的实现方式。 即使您没有将表格称为

[MyDatabase].[dbo].[MyTable]

您仍然需要通过以下方式引用数据库:

USE [MyDatabase]

在剧本的前面。

答案 2 :(得分:0)

可以在单个查询中混合使用可信数据库表。当有人这样做时,将数据库包含在表格'路径上是合理和必要的。

如果存储过程和表位于同一个数据库中,我没有找到原因。

您可以通过数据库目录搜索所有数据库名称出现,以便修复您的开发。对于SQL Server 2005:

SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%databasename%'
GO

对于SQL Server 2000:

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%databasename%'
GO