当我在没有指定ldf文件的情况下运行此查询时,它会自动创建ldf文件。
Declare @DBname nvarchar(50) = 'Test'
Declare @path nvarchar(50) = 'D:\DB'
Declare @query nvarchar(max)
set @query = '
CREATE DATABASE ' + @DBname + '
ON
( NAME = ' +@DBname+',
FILENAME = '''+@path+'\'+@DBname+'.mdf'+''',
SIZE = 1024,
MAXSIZE = unlimited,
FILEGROWTH = 500 )
'
exec (@query)但是当我运行这个查询时:
Declare @DBname nvarchar(50) = 'Test'
Declare @path nvarchar(50) = 'D:\DB'
Declare @query nvarchar(max)
set @query = '
CREATE DATABASE ' + @DBname + '
ON
( NAME = '+@DBname+'_log'+',
FILENAME = ''' +@path+'\'+@DBname+'_log.ldf'+''',
SIZE = 100,
MAXSIZE = unlimited,
FILEGROWTH = 100 );
'
exec (@query)它创建了2个没有.ldf文件的.mdf文件。我不明白为什么它会自动创建2个.ldf文件,而不是像在上面的查询中那样自动创建mdf文件:
发布于 2019-08-28 08:57:53
您已经为mdf文件指定了ldf扩展名。它仍然是一个数据文件。日志文件使用' log ON‘指定,数据文件使用'ON’指定,就像您所做的那样。
实际的日志文件规范是可选的,默认情况下是创建的。
发布于 2019-08-28 09:03:11
您要在SQL中命名的文件是数据库文件,而不是日志文件。因此,您正在创建一个mdf文件,并给它一个ldf扩展名。就像要创建一个xlsx文件,但是给它一个csv的扩展名。
如果要指定日志文件的详细信息,则需要使用LOG ON语法进行指定;如文档创建指定数据和事务日志文件的数据库所示
USE master;
GO
CREATE DATABASE Sales
ON
( NAME = Sales_dat,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\saledat.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 )
LOG ON
( NAME = Sales_log,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\salelog.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB ) ;
GO就您的情况而言,这可能会导致:
DECLARE @DBname sysname = N'Test';
DECLARE @path sysname = N'D:\DB';
DECLARE @query nvarchar(MAX);
SET @query = N'CREATE DATABASE ' + QUOTENAME(@DBname) + N'
ON
( NAME = N' + QUOTENAME(@DBname, '''') + N',
FILENAME = N' + QUOTENAME(@path + N'\' + @DBname + N'.mdf', '''') + N',
SIZE = 1024,
MAXSIZE = unlimited,
FILEGROWTH = 500 )
LOG ON
( NAME = N' + QUOTENAME(@DBname + '_log', '''') + ',
FILENAME = N' + QUOTENAME(@path + N'\' + @DBname + N'_log.ldf', '''') + ',
SIZE = 100,
MAXSIZE = unlimited,
FILEGROWTH = 100 );';
EXEC sys.sp_executesql @query;请注意,我已经将您的数据类型更改为sysname,并使用QUOTENAME来避免注入。如果您的路径比128个字符长,这是行不通的;但根据示例,我认为这是不可能的。
如果您有超过128个字符,请使用下面的语法来表示路径表达式。
N'...N''' + REPLACE({Your Path Expression}, '''', '''''') + N''' ...'https://stackoverflow.com/questions/57688523
复制相似问题