在SQL Server Management Studio中,可以选择为给定实例设置默认数据库路径:
这很有效。当我说
CREATE DATABASE test
它在我指定的路径E:\data
中创建。大。
但是如何在T-SQL中获取此路径(用于设置脚本)?
Contrary到many pages say,DefaultData
或DefaultLog
没有注册表项(在我的计算机上)。我在XP 64上运行SQL Server 2005 Express。
此值必须存储在某处。在哪里?
答案 0 :(得分:6)
您是否可以访问SQL事件探查器?
我没有安装SQL 2005 Express但是当我在运行Profiler的机器上查看该属性页面时,我可以看到SQL Server从我的SQL 2008实例上检索它的位置。
declare @SmoDefaultFile nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE',
N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData',
@SmoDefaultFile OUTPUT
select ISNULL(@SmoDefaultFile,N'') AS [DefaultFile]
编辑:以上内容对我来说也适用于SQL Server 2005 Developer Edition,但只有在我将默认路径更改为默认路径以外的其他路径之后。
答案 1 :(得分:2)
SELECT df.physical_name
FROM SYS.DATABASE_FILES df
答案 2 :(得分:1)
我这样做了。该示例适用于任何数据库。当您不确定代码中的默认位置时,您始终可以创建一个新的临时数据库并在使用此脚本后删除:
Scanner stdin = new Scanner(System.in);
System.out.print("Enter a and b numbers between the interval [-128,127] (-1 -1 to exit): ");
String inputString = stdin.nextLine();
String[] inputArray = inputString.split(" ");
byte a = Byte.parseByte(inputArray[0]);
byte b = Byte.parseByte(inputArray[1]);
或者:
DECLARE @databasetocheck AS nvarchar(128) = 'AnotherTestDb'
SELECT '[' + @@SERVERNAME + ']' AS [Server Name],
[sdb].[name] AS [Database Name],
[saf].[name] AS [Logical File Name],
[saf].[filename] AS [Full path and name],
LEFT([saf].[filename], (LEN([saf].[filename]) - LEN(REVERSE(LEFT(REVERSE([saf].[filename]), CHARINDEX('\', REVERSE([saf].[filename])) -1))))) AS [File Location],
LEFT(RIGHT([saf].[filename], (LEN(REVERSE(LEFT(REVERSE([saf].[filename]), CHARINDEX('\', REVERSE([saf].[filename])) -1))))), CHARINDEX('.', RIGHT([saf].[filename], (LEN(REVERSE(LEFT(REVERSE([saf].[filename]), CHARINDEX('\', REVERSE([saf].[filename])) -1))))))-1)AS [Physical File Name],
RIGHT([saf].[filename], (LEN(REVERSE(LEFT(REVERSE([saf].[filename]), CHARINDEX('.', REVERSE([saf].[filename])) -1))))) AS [File Extension]
FROM [master].[dbo].[sysaltfiles] [saf], [master].[dbo].[sysdatabases] [sdb]
WHERE [saf].[dbid] = [sdb].[dbid]
AND [sdb].[name] = @databasetocheck
GO
祝你好运!
答案 3 :(得分:0)
正如OP指出的那样,DefaultFile
/ DefaultLog
注册表值并不总是存在(例如,如果它们自初始安装后尚未重新配置)。在这种情况下,行为似乎是相对于主db / log文件所在的路径创建数据库/日志。
通过SMO
考虑到这一点,我总是使用SMO(通过PowerShell)并使用.DefaultFile
或者.MasterDbPath
Server
上的$smoServer = new-object Microsoft.SqlServer.Management.Smo.Server $sqlServer
$str = $smoServer.DefaultFile
if ($str)
{
$str;
}else{
$smoServer.MasterDBPath;
}
,例如:
CREATE DATABASE blah
(有关完整脚本,请参阅https://gist.github.com/piers7/d8f4a75232e5983f7f5b)
通过注册表
如果你想直接点击注册表,我认为这不是相当,因为我认为masterdb路径只是通过服务参数公开,而不是作为其中的专用密钥自己的权利(可能是错的:从来没有真正追求过这么多)。
通过TSQL
在TSQL中,似乎没有特别干净的方法(使用xp_instance_regread需要SA权限,例如,不仅仅是db_datacreator - 请参阅https://connect.microsoft.com/SQLServer/feedback/details/515132/management-studio-generates-scripts-that-use-unsupported-undocumented-procedures)。
然而,这里真正简单的选择就是使用
CREATE DATABASE [$(databaseName)
ALTER DATABASE [$(databaseName)] MODIFY FILE ( NAME = N'$(databaseName)', SIZE = 204800KB )
...让默认设置自己完成!如果您只需要路径以便可以同时创建数据库和设置文件大小/增长,那么您可以随时更改数据库,然后立即实现同样的事情:
{{1}}
......无需担心所有路径