全部,我有以下查询
IF NOT EXISTS (SELECT name
FROM sys.databases
WHERE name = N'Report')
BEGIN
DECLARE @DatabasePath NVARCHAR(1000);
SET @DatabasePath = (SELECT ResultMessage + '\'
FROM [Admin]..[Process]);
EXEC ispCREATEDB N'Report', @DatabasePath, N'10MB', N'20%'
END
ELSE
BEGIN
IF EXISTS (SELECT *
FROM Report.sys.objects
WHERE name = N'FatalErrSumm' AND type = N'U')
BEGIN
DROP TABLE [Report]..[FatalErrSumm];
CREATE TABLE [Report]..[FatalErrSumm]
(
[MDF] NVARCHAR(255) NULL,
[Error] INT NULL,
);
END
END
检查来自不同数据库的Report
是否存在;如果它不存在,则创建它,如果存在,则检查表FatalErrSumm
是否存在,如果存在,则删除并重新创建它。
问题在于它似乎正在执行IF NOT EXISTS
块的两种可能性并给出错误
Msg 2702, Level 16, State 2, Line 24
Database 'Report' does not exist.
数据库Report
不存在时。所以它永远不应该进入ELSE
块,但它似乎是。这是非常基本的东西,但我不能为我的生活发现错误,我在这里做错了什么?
感谢您的时间。
答案 0 :(得分:1)
你应该使用动态sql
绕过它 IF NOT EXISTS (SELECT name
FROM sys.databases
WHERE name = N'Report')
BEGIN
DECLARE @DatabasePath NVARCHAR(1000);
SET @DatabasePath = (SELECT ResultMessage + '\'
FROM [Admin]..[Process]);
EXEC ispCREATEDB N'Report', @DatabasePath, N'10MB', N'20%'
END
ELSE IF DB_ID('Report') IS NOT NULL
EXEC
(
'BEGIN
IF EXISTS (SELECT *
FROM Report.sys.objects
WHERE name = N''FatalErrSumm'' AND type = N''U'')
BEGIN
DROP TABLE [Report]..[FatalErrSumm];
CREATE TABLE [Report]..[FatalErrSumm]
(
[MDF] NVARCHAR(255) NULL,
[Error] INT NULL,
);
END
END'
);
答案 1 :(得分:1)
我认为动态sql是一个很好的解决方案。因为在编译时编译器检查到您的服务器中不存在数据库“report”。
答案 2 :(得分:-1)
如果报告处于脱机状态,我认为这很麻烦,请检查数据库是否在线/已连接。 sys.databases表中有这个标志。
也不要把你的陈述放在ELSE中。如果输入'THEN'部分,则创建数据库。之后检查它是否已创建。总是检查你的FATALERRSUMM表而不是IF。
伪代码:
if (not exists database) -- watch it not exists is really NOT EXISTS not just not online
create the database
if (exists database and not online)
put online the database
if (not exists database or not online database)
throw error
if (exists table fatalerrsum)
drop table
create table