Вопрос или проблема
Я просто пытаюсь получить разумное объяснение, я обошел проблему.
На моем сервере установлены 2 версии PowerShell: 4.0 и 7.4.
Если я открою два консоли и выполню команду Get-Module -ListAvailable
, SQLPS отображается в обеих.
Но если я попытаюсь выполнить команду, такую как Invoke-Sqlcmd
или Import-Module SQLPS
, это работает в PS4, но не работает в PS7:
Import-Module: Не удалось загрузить файл или сборку 'Microsoft.SqlServer.Smo, Culture
=neutral, PublicKeyToken=null'. Система не может найти указанный файл.
Я бы понял (и использовал бы обычный метод “удалить папку и переустановить”), если бы это не работало на обеих версиях. Но это работает хорошо в PS4, PS7 не может найти файл, хотя PS4 может?
Как я сказал, это не настоящая проблема, я смог импортировать свои данные в БД через DTSX, но я просто хочу понять, почему.
Спасибо за любую помощь по этому вопросу.
Ответ или решение
Проблема, с которой вы столкнулись, связана с различиями между версиями PowerShell, особенно между PowerShell 4.0 и PowerShell 7.x. Давайте рассмотрим, что может вызвать ошибку при попытке загрузить модуль SQLPS в PowerShell 7, а также возможные шаги, которые могут помочь в решении этой проблемы.
Причины проблемы
-
Совместимость между версиями PowerShell:
- SQLPS — это модуль, разработанный для PowerShell 5.1 и более ранних версий. PowerShell 7.x (основанный на .NET Core) не всегда поддерживает компоненты, разработанные для предыдущих версий PowerShell, так как PowerShell 7 использует .NET 5/6, а не .NET Framework.
- Некоторые зависимости или библиотеки, используемые в SQLPS, могут не быть доступны или несовместимы с .NET Core, что и вызывает ошибку "Could not load file or assembly".
-
Отсутствие необходимых сборок:
- Ошибка, которую вы видите, указывает на то, что в среде PowerShell 7 не может быть загружена сборка «Microsoft.SqlServer.Smo». Это может означать, что необходимая сборка не установлена на ваше устройство, либо она находится в недоступном для PowerShell 7 месте.
Как это исправить
Поскольку вы уже нашли обходной путь через DTSX, это здорово. Однако если вы все же хотите использовать Invoke-Sqlcmd
и SQLPS
в PowerShell 7, рассмотрите следующие варианты:
-
Установка SqlServer модуля:
- Вместо SQLPS попробуйте использовать новый модуль
SqlServer
, который поддерживает PowerShell 7. Этот модуль включает в себя командлеты, такие какInvoke-SqlCmd
, и является кросс-платформенным. - Установите модуль SqlServer с помощью следующей команды:
Install-Module -Name SqlServer -AllowClobber
- После установки попробуйте импортировать модуль и использовать
Invoke-SqlCmd
.
- Вместо SQLPS попробуйте использовать новый модуль
-
Проверка наличия необходимых сборок:
- Убедитесь, что у вас установлены все необходимые зависимости для модуля SQLPS, если вы все-таки хотите его использовать в PowerShell 7. Это может включать поиск и установку сборок Microsoft.SqlServer.Smo и других, которые SQLPS требует.
-
Запуск PowerShell 7 с использованием Windows Compatibility Module:
- Если вам необходимо запускать старые модули, можно использовать Windows Compatibility Module, который позволяет выполнять коды и модули, написанные для PowerShell 5.1, в PowerShell 7.
- Это делается с помощью команды:
Import-Module WindowsCompatibility
-
Проверка переменных окружения:
- Убедитесь, что PATH переменной окружения включает пути к необходимым библиотекам SQL Server и SMO, это может помочь в нахождении необходимых файлов.
Заключение
Общая причина проблемы в том, что SQLPS уже не поддерживается для более поздних версий PowerShell на платформе .NET Core. Для нового кода и проектов рекомендуется использовать модуль SqlServer. Если у вас есть какие-либо дополнительные вопросы или нужны уточнения, пожалуйста, дайте мне знать!