【发布时间】:2026-01-05 09:45:01
【问题描述】:
有 2 个数据库:MAIN 和 IP2LOCATION
在 MAIN 中,我有以下存储过程:
CREATE PROCEDURE dbo.Update_IP2Location_DB11_from_CSV
AS
BEGIN
IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[ip2location].[dbo].[db11_new]') AND type in (N'U'))
BEGIN
CREATE TABLE [ip2location].[dbo].[db11_new]
(
[ip_from] bigint NOT NULL,
[ip_to] bigint NOT NULL,
[country_code] nvarchar(2) NOT NULL,
[country_name] nvarchar(64) NOT NULL,
[region_name] nvarchar(128) NOT NULL,
[city_name] nvarchar(128) NOT NULL,
[latitude] float NOT NULL,
[longitude] float NOT NULL,
[zip_code] nvarchar(30) NOT NULL,
[time_zone] nvarchar(8) NOT NULL,
) ON [PRIMARY]
CREATE INDEX [ip_from] ON [ip2location].[dbo].[db11_new]([ip_from])
END
ELSE
BEGIN
DELETE FROM [ip2location].[dbo].[db11_new]
END
BULK INSERT [ip2location].[dbo].[db11_new]
FROM 'D:\IP2LOCATION-LITE-DB11.CSV'
WITH
( FORMATFILE = 'C:\inetpub\wwwroot\ws\DB11_ip4.FMT')
EXEC sp_rename N'dbo.db11', N'db11_old', 'OBJECT'
EXEC sp_rename N'ip2location.dbo.db11_new', N'db11', 'OBJECT'
END
不能正常工作:
如果 db11_new 不存在,它(正确地)创建它,但如果它存在.. 我明白了
数据库中已经有一个名为“db11_new”的对象。
所以好像有什么问题
IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[ip2location].[dbo].[db11_new]') AND type in (N'U'))
并且在使用 2 Rename 的过程结束时,我(总是)得到以下答案
消息 15248,级别 11,状态 1,过程 sp_rename,第 359 行 要么参数@objname 不明确,要么声明的@objtype (OBJECT) 错误。
似乎问题是因为存储过程没有存储到 ip2location DB 中,而是存储在另一个数据库中..
可以提出一个解决方案,考虑到我更愿意将所有存储过程保留在 MAIN DB 中,因为所有其他存储空间都存在?
谢谢
【问题讨论】:
-
db11_old发生了什么?第一次运行此过程后,它会创建表db11_old,当第二次尝试运行此 SP 时,它会出现sb11_oldalready 出现的错误。
标签: sql-server stored-procedures table-rename