Sql server Sql脚本为新数据库创建问题
我想创建sql脚本,该脚本将在服务器上运行,以检查数据库是否不存在,然后创建新数据库,如果存在,则更新其表和SP。但问题是,如果它不存在,它会创建数据库,但表和sp会转到主数据库 样品Sql server Sql脚本为新数据库创建问题,sql-server,tsql,Sql Server,Tsql,我想创建sql脚本,该脚本将在服务器上运行,以检查数据库是否不存在,然后创建新数据库,如果存在,则更新其表和SP。但问题是,如果它不存在,它会创建数据库,但表和sp会转到主数据库 样品 DECLARE @dbname nvarchar(128) SET @dbname = N'ABC' IF (NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' + name + ']' = @dbna
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
这是正在运行的代码
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;
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];
');
另一种方法是只制作两个脚本,然后使用batchfile或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
标记您正在使用的dbms。该代码是特定于产品的。Go分割批处理如果您希望强制执行,您将必须使用Dynamic Sequel抱歉,我没有得到您