在SQL脚本中使用数据库名称作为完整表名

4

我曾经因为一个bug困扰了一段时间,后来在一个存储过程代码中发现了原因。该代码在表名中包含了一个旧数据库的名称,而当前数据库的名称已经不同了。因此,我想问:

有没有一种情况下,将数据库名称作为完整表名(数据库名称+模式名称+表名称)的一部分是合理的(前提是我们不接触其他数据库中的表),还是说这总是一个不好的做法?如何在SQL脚本中正确使用数据库名称,使代码对特定数据库保持中立性?

以下仅为示例代码:

CREATE PROCEDURE [dbo].[MyProc] 
AS
BEGIN
 DELETE FROM [MyDatabase].[dbo].[MyTable] 
END
3个回答

3
不,除非需要处理两个数据库,否则不应在存储过程中使用数据库名称。
这会导致你看到的错误。当数据库名称更改时,所有SP代码将中断,或者继续工作,但在旧数据库上工作。
如果应用程序动态选择要插入查询的数据库名称,则可以使用它来向数据库发送SQL查询。
我的建议是对数据库架构进行完整导出,并搜索硬编码的数据库名称并将其删除。

2

这真的取决于你的脚本是如何实现的。 即使您不将表格称为

[MyDatabase].[dbo].[MyTable]

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

USE [MyDatabase]

在脚本的早期。


0

可以在单个查询中混合可信数据库表。当有人这样做时,必须将数据库包含在表“path”上是合理且强制性的。

如果存储过程和表位于同一数据库中,则我找不到此场景之外的原因。

您可以通过数据库目录搜索所有数据库名称出现次数,以修复开发问题。 对于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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接