Использование идентификаторов SQL Server в PowerShell
Если поставщик SQL Server для Windows PowerShell используется вместе с компонентом Database Engine, необходимо предоставить имя компьютера и имя экземпляра, даже для экземпляров по умолчанию.
Этот поставщик использует в путях Windows PowerShell идентификаторы SQL Server. Идентификаторы SQL Server могут содержать символы, которые Windows PowerShell в путях не поддерживает. При использовании идентификаторов в путях Windows PowerShell такие символы следует экранировать либо применять для них специальную кодировку.
Имена компьютеров
Первый узел, следующий за SQLSERVER:\SQL, является именем компьютера, на котором выполняется экземпляр компонента Database Engine; например, SQLSERVER:\SQL\МойКомпьютер. Если среда Windows PowerShell установлена на одном компьютере с экземпляром компонента Database Engine, то вместо имени компьютера можно использовать localhost или (local). Скрипты, в которых указано localhost или (local), можно выполнять на любом компьютере, при этом изменять их путем внесения имен разных компьютеров не требуется. Например, следующая команда будет направлена в образец базы данных База данных AdventureWorks2008R2 экземпляра по умолчанию на локальном компьютере:
Set-Location SQLSERVER:\SQL\localhost\DEFAULT\Databases\AdventureWorks2008R2
Windows PowerShell обычно обрабатывает символы скобок в (local) как команды. Необходимо:
заключать строки пути в кавычки;
Set-Location "SQLSERVER:\SQL\(local)\DEFAULT\Databases\AdventureWorks2008R2"
экранировать скобки при помощи символа обратной кавычки (`);
Set-Location SQLSERVER:\SQL\`(local`)\DEFAULT\Databases\AdventureWorks2008R2
кодировать скобки с помощью шестнадцатеричного представления:
Set-Location SQLSERVER:\SQL\%28local%29\DEFAULT\Databases\AdventureWorks2008R2
Экранирование и кодирование символов подробно описаны далее в этом разделе.
Для указания локального компьютера в скриптах PowerShell нельзя использовать точку (.). Точка не поддерживается, так как PowerShell интерпретирует точку как команду.
Имена экземпляров по умолчанию
На одном и том же компьютере можно запустить несколько экземпляров исполняемой программы компонента Database Engine. Экземпляры компонента Database Engine идентифицируются сочетанием имени компьютера и имени экземпляра, например МойКомпьютер\МойЭкземпляр.
На каждом компьютере может быть только один экземпляр компонента Database Engine по умолчанию. При установке экземпляра по умолчанию указывать для него имя не нужно. При указании в строке соединения только имени компьютера происходит подключение к экземпляру по умолчанию на этом компьютере. Все прочие экземпляры на компьютере должны быть именованными. Имя экземпляра указывается во время установки, а в строке соединения необходимо указывать и имя компьютера, и имя экземпляра.
Для поставщика SQL Server всегда необходимо указывать имя экземпляра. Для экземпляров по умолчанию необходимо указывать имя DEFAULT.
Идентификаторы SQL Server в путях Windows PowerShell
Поставщики Windows PowerShell предоставляют доступ к иерархиям данных с помощью структуры путей, аналогичной используемой в файловой системе Windows. В поставщике SQL Server реализуются пути к объектам SQL Server. Для компонента Database Engine жесткий диск задается как SQLSERVER, а первая папка — как \SQL. Объекты базы данных указываются как контейнеры и элементы. Ниже приведен путь к таблице Vendor в схеме Purchasing базы данных База данных AdventureWorks2008R2 на экземпляре компонента Database Engine по умолчанию:
SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks2008R2\Tables\Purchasing.Vendor
Идентификаторы SQL Server представляют собой имена объектов SQL Server, такие как имена таблиц или столбцов. Существуют два типа идентификаторов SQL Server.
Обычные идентификаторы ограничены набором символов, которые также поддерживаются в путях Windows PowerShell. Такие имена можно использовать в путях Windows PowerShell без изменения.
В идентификаторах с разделителями можно использовать символы, неподдерживаемые в именах путей Windows PowerShell. Идентификаторами с разделителями называют идентификаторы, заключенные в квадратные скобки (например: [ИмяИдентификатора]) и заключенные в кавычки (например: "ИмяИдентификатора"). Если в идентификаторе с разделителями используются символы, неподдерживаемые в путях Windows PowerShell, эти символы нужно кодировать или экранировать перед использованием идентификатора в качестве имени элемента или контейнера. Кодировка применяется для всех символов. С другой стороны, экранирование некоторых символов, таких как символ двоеточия (:), невозможно.
Кодировка и декодирование идентификаторов
Символы, неподдерживаемые в именах путей Windows PowerShell, могут быть представлены или закодированы в виде символа «%», за которым следует шестнадцатеричное значение для битового шаблона, представляющего символ, например «**%**xx». Для обработки символов, неподдерживаемых в обозначениях путей Windows PowerShell, всегда можно использовать кодировку.
Командлет Encode-SqlName получает в качестве входных данных идентификатор SQL Server. Он возвращает строку, в которой все символы, не поддерживаемые языком Windows PowerShell, закодированы в виде «%xx». Командлет Decode-SqlName получает в качестве входных данных закодированный идентификатор SQL Server и возвращает исходный идентификатор. Например:
Эта команда возвращает строку «Table%3ATest»:
Encode-SqlName "Table:Test"
Эта команда возвращает строку «Table:Test»:
Decode-SqlName "Table%3ATest"
При указании в командлетах Windows PowerShell идентификаторов с разделителями можно либо закодировать необходимые символьные значения самостоятельно, либо применить для подготовки закодированных символов командлет Encode-SqlName. Например, если уже произошел переход к схеме, которая содержит таблицу [Table:Test], можно перейти к таблице с помощью строки с закодированным символом «:» :
Set-Location Table%3ATest
Также можно воспользоваться командлетом Encode-SqlName, чтобы сформировать имя, поддерживаемое средой Windows PowerShell:
Set-Location (Encode-SqlName "Table:Test")
Ниже приведены символы, кодируемые командлетом Encode-SqlName и декодируемые командлетом Decode-SqlName:
Символ |
\ |
/ |
: |
% |
< |
> |
* |
? |
[ |
] |
| |
Шестнадцатеричная кодировка |
%5C |
%2F |
%3A |
%25 |
%3C |
%3E |
%2A |
%3F |
%5B |
%5D |
%7C |
Экранирование символов
Часто можно использовать escape-символ обратной кавычки Windows PowerShell (`) для экранирования символов, применение которых допускается в идентификаторах с разделителями SQL Server, но не в именах путей Windows PowerShell. Тем не менее экранирование некоторых символов невозможно. Например, в среде Windows PowerShell нельзя экранировать символ двоеточия (:). Идентификаторы с этим символом должны быть закодированы. Кодировка более надежна, чем экранирование, поскольку действует для всех символов.
Ниже приведен пример экранирования символа #:
cd SQLSERVER:\SQL\MyComputer\MyInstance\MyDatabase\MySchema\`#MyTempTable
Символ обратной кавычки (`) обычно расположен на клавише в верхнем левом углу клавиатуры, под клавишей ESC.
Идентификаторы SQL Server в командлетах
Некоторые командлеты SQL Server имеют параметры, в которые в качестве входных данных передается идентификатор. Значения таких параметров обычно задаются в виде строковых констант, заключенных в кавычки, или строковых переменных. Если идентификаторы задаются в виде строковых констант или в переменных, то конфликты с набором символов, поддерживаемых Windows PowerShell, не возникают.
См. также