【问题标题】:Create database with t-SQL without specifying its file name使用 t-SQL 创建数据库而不指定其文件名
【发布时间】:2013-11-01 01:04:52
【问题描述】:

我尝试运行以下 SQL 语句来创建数据库:

string strSQL = "CREATE DATABASE " + strDatabaseName +
    " ON PRIMARY " +
    "(" +
    "SIZE = 10MB, FILEGROWTH = 20%) " +
    "LOG ON (" +
    "SIZE = 5MB, " +
    "FILEGROWTH = 20%)" +
    " COLLATE SQL_Latin1_General_CP1_CI_AS;";

我想使用默认的 .mdf 和 .ldf 文件位置,但指定大小和文件增长参数。问题是当我运行它时出现错误:

此 CREATE/ALTER DATABASE 中需要文件选项 FILENAME 声明。

那么有什么方法可以实现我想要实现的目标吗?

【问题讨论】:

    标签: c# asp.net sql sql-server tsql


    【解决方案1】:

    试试这个。

          string strSql = " DECLARE @data_path nvarchar(256); "+
    "SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)"+
     "                 FROM master.sys.master_files"+
      "                WHERE database_id = 1 AND file_id = 1);"+
    
    
    "EXECUTE ('CREATE DATABASE " + strDataBaseName +
    "ON PRIMARY "+
       "("+
       "  NAME = FileStreamDB_data "+
       " ,FILENAME = ''' + @data_path + '" + strDataBaseName +"_data.mdf''"+
       " ,SIZE = 10MB"+
       " ,MAXSIZE = 50MB"+
       " ,FILEGROWTH = 15%"+
       " )LOG ON ("+
       " NAME = FileStreamDB_log"+
       " ,FILENAME = ''' + @data_path + '" + strDataBaseName + "_log.ldf''" +
       " ,SIZE = 5MB, "+
       " FILEGROWTH = 20%)"+
    "     COLLATE SQL_Latin1_General_CP1_CI_AS')";
    

    【讨论】:

    • 谢谢。效果很好。我看到您采用了第一个可用数据库的路径并使用它来构建我的新数据库路径。我很好奇,id=1 的数据库总是master.mdf 吗?这可以在远程 SQL Server 上运行吗?
    • 是的。应该是,因为不会有没有主数据库的 sql-server 实例,并且 sql 服务器首先创建主数据库,所以 db 应该有 id =1
    • 请注意,您可以从服务器属性 SERVERPROPERTY('instancedefaultdatapath') 和 SERVERPROPERTY('instancedefaultlogpath') 中获取实际的默认路径。这就是 SSMS 在幕后所做的 - 打开“新建数据库”对话框时检查 SQL Server Profiler。
    【解决方案2】:

    根据@sahalMoidu 的建议,这里是他的SQL 稍微更新的版本:

    DECLARE @dbFileName nvarchar(256);
    CREATE DATABASE [testdb2] COLLATE SQL_Latin1_General_CP1_CI_AS;
    SET @dbFileName = (SELECT [name] FROM master.sys.master_files WHERE [database_id] = DB_ID(N'testdb2') AND file_id = 1);
    EXECUTE ('ALTER DATABASE [testdb2]
     MODIFY FILE(
    NAME = ''' + @dbFileName + ''',
    SIZE = 5MB,
    MAXSIZE = UNLIMITED,
    FILEGROWTH = 20%
    );
    

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多