我在一段时间内遇到了一个bug,然后在数据库存储过程代码中找到了它的原因,该代码包含表名中数据库的旧名称,而当前数据库名称已经不同了。所以,我想问一下:
是否存在使用数据库名称作为完整表名称(数据库名称+模式名称+表名称)的一部分的情况(如果我们不这样做)触摸其他数据库中的表)或者它总是一个不好的做法?如何在sql脚本中正确使用数据库名称以保持代码与特定数据库无关?
代码仅用于说明:
CREATE PROCEDURE [dbo].[MyProc]
AS
BEGIN
DELETE FROM [MyDatabase].[dbo].[MyTable]
END
答案 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