我想使用传递给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
语句指定路径?
答案 0 :(得分:1)
转换为nvarchar是安全的,我会按照您在某些脚本中的计划执行相同的操作。从未遇到过问题
SELECT CAST(SERVERPROPERTY('CollationID') AS nvarchar(10))
这可能是文件疏忽。较新的属性(“适用于:”和SQL Server 2012+)没有基本数据类型。较旧的房产