我想创建一个sql脚本,它将在服务器上工作以检查数据库是否不存在然后创建新的,如果它存在则更新其表和SP。但问题是它不存在,它创建数据库,但表和sp已经转为master数据库。
样品。
DECLARE @dbname nvarchar(128)
SET @dbname = N'ABC'
IF (NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' +
name + ']' = @dbname OR name = @dbname)))
BEGIN
PRINT 'New Database '
CREATE DATABASE [ABC];
USE ABC; // This use statement is not working i supposed
CREATE TABLE [dbo].[Product_Container](
[ProductID] [int] NOT NULL,
[ContainerID] [int] NOT NULL,
[AssociatedProductID] [int] NOT NULL
) ON [PRIMARY]
END
ELSE
BEGIN
PRINT 'Existing Database '
END
答案 0 :(得分:0)
这是运行代码。
begin
DECLARE @dbname nvarchar(128), @command1 nvarchar(max), @command2 nvarchar(max)
SET @dbname = N'ABC'
IF (NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = @dbname))
BEGIN
PRINT 'New Database Creating' + @dbname
set @command1 = 'USE MASTER; CREATE DATABASE ' + @dbname + '; '
--set @command += 'USE ' + @dbname + '; '
set @command2 = 'CREATE TABLE [ABC].[dbo].[Product_Container](
[ProductID] [int] NOT NULL,
[ContainerID] [int] NOT NULL,
[AssociatedProductID] [int] NOT NULL
) ON [PRIMARY];'
END
ELSE
BEGIN
PRINT 'Existing Database ' + @dbname
END
exec sp_executesql @command1;
exec sp_executesql @command2;
end;
答案 1 :(得分:0)
USE
语句中的数据库名称被解释为正在解析脚本;
之前正在执行脚本。
因此,CREATE DATABASE
和USE
不能属于同一批次。
我建议多次分割脚本。
这意味着你必须摆脱IF
声明。
我建议改为使用例外。
批量拆分脚本并不像看起来那么简单。 即使异常也不会阻止第二批执行,即使第一批失败也是如此。 正如@clifton_h所提出的,您可以使用动态SQL。 这意味着,将整个第二部分放在一个字符串中。 我并不特别喜欢这种方法,因为它会使脚本难以维护。
DECLARE @dbname nvarchar(128) = N'ABC';
IF DB_ID(@dbname) IS NOT NULL THROW 51000, 'Existing Database.', 1;
PRINT 'New Database.';
CREATE DATABASE [ABC];
EXEC('
USE ABC;
CREATE TABLE [dbo].[Product_Container](
[ProductID] [int] NOT NULL,
[ContainerID] [int] NOT NULL,
[AssociatedProductID] [int] NOT NULL
) ON [PRIMARY];
');
另一种方法是简单地制作两个脚本,然后使用批处理文件或Powershell脚本执行另一个脚本,同时考虑第一个脚本抛出的任何异常。
第一个脚本创建数据库:
DECLARE @dbname nvarchar(128) = N'ABC';
IF DB_ID(@dbname) IS NOT NULL THROW 51000, 'Existing Database.', 1;
PRINT 'New Database.';
CREATE DATABASE [ABC];
第二个脚本创建表和其他数据库对象:
USE ABC;
CREATE TABLE [dbo].[Product_Container](
[ProductID] [int] NOT NULL,
[ContainerID] [int] NOT NULL,
[AssociatedProductID] [int] NOT NULL
) ON [PRIMARY];
最后,将一个样本批处理文件放在一起:
@echo off
echo Script 1...
sqlcmd -b -E -i script1.sql
if errorlevel 1 goto end
echo Script 2...
sqlcmd -b -E -i script2.sql
if errorlevel 1 goto end
echo Successfully completed.
:end