在CREATE DATABASE中使用InstanceDefaultDataPath和InstanceDefaultLogPath

时间:2018-01-30 11:34:25

标签: sql-server tsql

我想使用传递给FILENAME语句的CREATE DATABASE的默认路径,如下所示:

DECLARE @MdfPath NVARCHAR(1024) = SERVERPROPERTY('InstanceDefaultDataPath');

EXEC ('
    CREATE DATABASE [SoTest]
    ON PRIMARY
    (NAME = N''SoTest'', FILENAME = N''' + @MdfPath + '/SoTest.mdf'')
    LOG ON
    (NAME = N''SoTest_log'', FILENAME = N''' + @MdfPath + '/SoTest_log.ldf'')
');

但这给了我:

  

不允许从数据类型sql_variant到nvarchar的隐式转换。使用CONVERT函数运行此查询。

这是有道理的,因为SERVERPROPERTY(...)会返回SQL_VARIANT

我可以按照以下错误消息提示:

DECLARE @MdfPath NVARCHAR(1024) = CAST(SERVERPROPERTY('InstanceDefaultDataPath') AS NVARCHAR(1024));
DECLARE @LdfPath NVARCHAR(1024) = CAST(SERVERPROPERTY('InstanceDefaultLogPath') AS NVARCHAR(1024));

然后它适用于我的情景。但the appropriate MSDN page没有为这两个属性指定“基础数据类型”(就像对其他属性一样),因此我不确定我的代码是否安全且可移植。

是否知道这两个服务器属性的基础数据类型是什么?转换为上面的NVARCHAR是否安全?是否有更合适的方法为CREATE DATABASE语句指定路径?

1 个答案:

答案 0 :(得分:1)

转换为nvarchar是安全的,我会按照您在某些脚本中的计划执行相同的操作。从未遇到过问题

即使是base type is int

SELECT CAST(SERVERPROPERTY('CollationID') AS nvarchar(10))

这可能是文件疏忽。较新的属性(“适用于:”和SQL Server 2012+)没有基本数据类型。较旧的房产