Предположим, что у вас есть работающий экземпляр SQL Server Express с именем (local) \ SQLEXPRESS. Папка его базы данных - c: \ program files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data.
Как можно использовать VBScript для получения этой папки?
Может быть, с помощью SMO? И если да, то как? <- Забудь об этом. SMO использует .NET. Возможно только в PowerShell.
Обновлять: Причина этого в том, что я разрабатываю установку MSI, которая использует настраиваемое действие (вызов сборки на основе .NET) для присоединения файлов mdf к существующему экземпляру сервера SQL. для этого файлы .mdf переносятся с установочного носителя на жесткий диск. Таким образом, программе установки необходимо знать, где разместить файлы.
Поскольку я хотел бы поддержать стандарты, мне нужно поместить файлы в общую папку данных.
Обновлять: При выборе экземпляра SQL-сервера в InstallShield свойство IS _ SQLSERVER _ SERVER устанавливается с именем экземпляра.
Я обнаружил, что могу запросить реестр в HKLM \ Software \ Microsoft \ Microsoft SQL Server \ Instance Names \ SQL, чтобы получить имя SQL для имени экземпляра (например, SQLEXPRESS -> MSSQL.1).
Обладая этой информацией, я могу запросить HKLM \ Software \ Microsoft \ Microsoft SQL Server \ MSSQL.1 \ Setup, чтобы получить ключ SQLDataRoot. Когда я добавляю \ Data к найденному здесь значению, у меня есть папка, которую я искал.
Однако есть ли способ лучше?





Если бы вы сказали, зачем вы это делаете, будет проще.
SQL Server позволяет размещать файлы на любом локальном диске с буквой (можно перемещать даже master, model, msdb и temp), хотя во время установки для каждого экземпляра используется папка по умолчанию.
Since I would like to support the standards, I need to place the files into the common data folder.
Если бы я был администратором баз данных, устанавливающим ваше программное обеспечение, я бы предпочел, чтобы вы не помещали их в это место (которое обычно находится на диске C :.). Я бы предпочел, чтобы вы спросили меня, где их установить, потому что, если эти базы данных имеют хотя бы умеренно значительное использование, они собираются размещаться на дисках SAN, где я могу легко увеличить емкость, и я хотел бы, чтобы база данных и журналы были на отдельных дисках (т.е. не так, как Microsoft устанавливает по умолчанию), и журнал, особенно на диске (т.е. не C:), где, если он заполняется, я не собираюсь выводить мой сервер из строя каким-либо образом.
Свойство PrimaryFilePath из SQL-DMO выглядит интересно.
В MSDN указано, что SQL-DMO устарел с SQL Server 2008, но пока он все еще должен работать.
Если вы больше не хотите использовать SQL-DMO, я думаю, что в пространстве имен root\Microsoft\SqlServer WMI есть что-то полезное. Но Microsoft либо очень хорошо это скрыла, либо мои поисковые навыки оставили меня, на данный момент я ничего не могу найти в этом отношении.
(Обновлено: удалено что-то, что не отвечало на вопрос.)
Путь к данным по умолчанию также сохраняется в реестре:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\DefaultData
Я не уверен, где экземпляры записывают свои данные, но это должно быть где-то в логической близости.
Используйте этот код в настраиваемом действии,
strName = "(local)\SQLEXPRESS"
arrNames = Split(strName, "\")
intIndex = Ubound(arrNames)
strFile = arrNames(intIndex)
strFile = trim(strFile)
if strFile <> "" then
reg = readFromRegistry("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\" & strFile & "\Setup\SQLPath", "")
reg = trim(reg)
if reg <> "" then
reg = reg & "\DATA"
end if
end if
msgbox reg
function readFromRegistry (strRegistryKey, strDefault )
Dim WSHShell, value
On Error Resume Next
Set WSHShell = CreateObject("WScript.Shell")
value = WSHShell.RegRead( strRegistryKey )
if err.number <> 0 then
readFromRegistry= strDefault
else
readFromRegistry=value
end if
set WSHShell = nothing
end function
Переменная reg получит путь. Вы можете указать имя экземпляра в переменной strName в начале.
Источник функции реестра:Как проверить значение реестра с помощью VbScript