Поделиться через


Использование идентификаторов 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, не возникают.