Write-SqlTableData

Записывает данные в таблицу базы данных SQL.

Синтаксис

Write-SqlTableData
     [-Force]
     -InputData <PSObject>
     [-Passthru]
     [-Timeout <Int32>]
     [[-Path] <String[]>]
     [-AccessToken <PSObject>]
     [-TrustServerCertificate]
     [-HostNameInCertificate <String>]
     [-Encrypt <String>]
     [<CommonParameters>]
Write-SqlTableData
     [-DatabaseName <String>]
     [-SchemaName <String>]
     [-TableName <String>]
     [-IgnoreProviderContext]
     [-SuppressProviderContextWarning]
     [-Force]
     -InputData <PSObject>
     [-Passthru]
     [-Timeout <Int32>]
     [[-ServerInstance] <String[]>]
     [-Credential <PSCredential>]
     [-ConnectionTimeout <Int32>]
     [-AccessToken <PSObject>]
     [-TrustServerCertificate]
     [-HostNameInCertificate <String>]
     [-Encrypt <String>]
     [<CommonParameters>]
Write-SqlTableData
     [-Force]
     -InputData <PSObject>
     [-Passthru]
     [-Timeout <Int32>]
     [-InputObject] <Table[]>
     [-AccessToken <PSObject>]
     [-TrustServerCertificate]
     [-HostNameInCertificate <String>]
     [-Encrypt <String>]
     [<CommonParameters>]

Описание

Командлет Write-SqlTableData вставляет данные в таблицу базы данных SQL. Этот командлет принимает следующие типы входных данных в следующих форматах вывода:

  • System.Data.DataSet
  • System.Data.DataTable
  • Объекты System.Data.DateRow
  • Коллекция объектов

При указании набора данных в базу данных записывается только первая таблица в наборе данных.

Этот командлет можно использовать с поставщиком SQL Windows PowerShell.

Этот командлет может выводить такие сведения, как сервер, база данных, схема и таблица, из текущего пути.

Этот командлет ожидает, что таблица будет существовать. По умолчанию командлет добавляет данные в эту таблицу.

Если указать параметр Force, командлет создает отсутствующие объекты, включая базу данных, схему таблицы и саму таблицу. Такое использование обеспечивает быструю передачу данных в базу данных. Командлет выводит схему таблицы из данных. Результат может оказаться неоптимальным. Например, строки сопоставляются с NVARCHAR(MAX).

Примеры

Пример 1. Запись сведений о процессах в таблицу

PS C:\> (Get-Process | Select-Object -Property Id,ProcessName,StartTime,UserProcessorTime,WorkingSet,Description) |
         Write-SqlTableData -ServerInstance "MyServer\MyInstance" -DatabaseName "MyDatabase" -SchemaName "dbo" -TableName "TaskManagerDump" -Force

Этот пример получает сведения о процессах, выполняемых в системе, и записывает их в таблицу.

Текущий командлет записывает данные MyDatabase.dbo.TaskManagerDump в .MyServer\MyInstance Так как вы указываете параметр Force , если база данных, схема и таблица не существуют, этот командлет создает их.

Пример 2. Запись данных в таблицу

PS C:\> cd SQLSERVER:\SQL\MyServer\MyInstance\Databases\MyDatabase\Tables
PS SQLSERVER:\SQL\MyServer\MyInstance\Databases\MyDatabase\Tables> $Table = Write-SqlTableData -TableName "KeyValuePairs" -SchemaName "dbo" -InputData @{ cca=10; cac='Hello'; aac=1.2 } -PassThru
PS SQLSERVER:\SQL\MyServer\MyInstance\Databases\MyDatabase\Tables> Read-SqlTableData -InputObject $Table

WARNING: Using provider context. Server = MyServer\MyInstance, Database = [MyDatabase]. 

Key Value
--- -----
aac   1.2
cac Hello
cca    10

Первая команда изменяет расположение на расположение в поставщике SQLSERVER. В командной строке отображается новое расположение. Для получения дополнительных сведений введите Get-Help about_Providers.

Последняя команда отображает содержимое переменной $Table с помощью командлета Read-SqlTableData .

Пример 3. Импорт данных из файла в таблицу

PS C:\> ,(Import-Csv -Path ".\a.csv" -Header "Id","Name","Amount") | Write-SqlTableData -ServerInstance "MyServer\MyInstance" -DatabaseName "MyDatabase" -SchemaName "dbo" -TableName "CSVTable" -Force
PS C:\> Read-SqlTableData -ServerInstance "MyServer\MyInstance" -DatabaseName "MyDatabase" -SchemaName "dbo" -TableName "CSVTable"

Id Name  Amount
-- ----  ------
10 AAAA  -1.2
11 BBBB   1.2
12 CCCC  -1.0

The first command imports the contents of a file by using the Import-Csv cmdlet. The file contains the following content:
    
10,AAAA,-1.2
11,BBBB,1.2
12,CCCC,-1.0

Этот пример выполняется полностью из командной строки файла. Он не может использовать сведения о контексте. Поэтому необходимо указать все соответствующие параметры.

Обратите внимание, что перед строкой используется слово "", чтобы заставить PowerShell передать все содержимое файла непосредственно командлету Write-SqlTableData , который, в свою очередь, может выполнять массовую вставку (которая значительно более эффективна, чем построчная вставка).

Пример 4. Получение данных из одного экземпляра и отправка в таблицу базы данных на другом экземпляре

PS C:\> (Invoke-Sqlcmd -query "SELECT @@SERVERNAME AS 'ServerName', DB_NAME(dbid) AS 'Database',
                              name, CONVERT(BIGINT, size) * 8 AS 'size_in_kb', filename
                              FROM master..sysaltfiles" `
   -ServerInstance MyServer\MyInstance -database master -OutputAs DataTables) |
   Write-SqlTableData -ServerInstance MyServer\MyOtherInstance -Database ServerStats -SchemaName dbo -TableName DatabasesSizes -Force

Этот пример получает сведения о размерах файлов базы данных из одного экземпляра с помощью командлета Invoke-SqlCmd и вставляет результирующие строки в базу данных на другом экземпляре SQL Server. Обратите внимание, что хотя в этом примере данные перемещаются между экземплярами SQL Server на одном компьютере, экземпляры могут находиться на двух совершенно разных серверах.

Пример 5. Запись данных в существующую таблицу базы данных Azure SQL (или любую базу данных с помощью проверки подлинности SQL)

Import-Module SqlServer

# Set your connection string to Azure SQL DB.
# If your server is not in Azure, just tweak the 'Data Source' field to point to your server.
# Warning: putting clear text passwords in your scripts is highly discoraged, so instead
# of using "User ID" and "Password" in the connection string, we prompt for the credentials.
$cred = Get-Credential -Message "Enter your SQL Auth credentials"
$cred.Password.MakeReadOnly()

# Get access to the SMO Server object.
$srv = Get-SqlInstance -ServerInstance "<your_server_name>.database.windows.net" -Credential $cred

# Get access to table 'MyTable1' on database 'MyDB'.
# Note: both objects are assumed to exists already.
$db = $srv.Databases["MyDB"]
$table = $db.Tables["MyTable1"]

# Write the first 4 integers into the table.
# Note: 'MyTable1' has a column 'Col1' of type 'int'
Write-SqlTableData -InputData (1..4) -InputObject $table

# Now, we read the data back to verify all went ok.
Read-SqlTableData -InputObject $table

# Output:
#
# Col1
# ----
#   1
#   2
#   3
#   4

В этом примере показано, как использовать командлет Write-SqlTableData с проверкой подлинности SQL. Большая часть кода — это просто ADO.Net и шаблон SMO, необходимый для создания необходимого объекта ( SMO Table объекта, представляющего целевую таблицу), который передается командлету -InputOject с помощью параметра .

Параметры

-AccessToken

Маркер доступа, используемый для проверки подлинности для SQL Server в качестве альтернативы проверке подлинности пользователя или пароля или проверки подлинности Windows.

Это можно использовать, например, для подключения к SQL Azure DB и SQL Azure Managed Instance с помощью Service Principal или Managed Identity.

Используемый параметр может быть строкой, представляющей маркер, или объектом, PSAccessToken возвращенным при выполнении .Get-AzAccessToken -ResourceUrl https://database.windows.net

Этот параметр является новым в версии 22 модуля.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ConnectionTimeout

Указывает время ожидания подключения к серверу в секундах до сбоя времени ожидания. Значение времени ожидания должно быть целым числом от 0 до 65 534. Если указано значение 0, попытки соединения не прекращаются.

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Credential

Указывает объект PSCredential для подключения к SQL Server. Чтобы получить объект учетных данных, используйте командлет Get-Credential. Для получения дополнительных сведений введите Get-Help Get-Credential.

Type:PSCredential
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DatabaseName

Указывает имя базы данных, содержащей таблицу.

Командлет поддерживает кавыкание значения. Вам не нужно ставить кавычки или экранировать специальные символы.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Encrypt

Тип шифрования, используемый при подключении к SQL Server.

Это значение сопоставляется со свойством EncryptSqlConnectionEncryptOption объекта SqlConnection драйвера Microsoft.Data.SqlClient.

В версии 22 модуля по умолчанию используется Optional значение (для совместимости с версией 21). В версии 23+ модуля значением по умолчанию будет "Обязательно", что может привести к критическому изменению для существующих скриптов.

Этот параметр является новым в версии 22 модуля.

Type:String
Accepted values:Mandatory, Optional, Strict
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Force

Указывает, что этот командлет создает отсутствующие объекты SQL Server. К ним относятся база данных, схема и таблица. Для создания этих объектов необходимо иметь соответствующие учетные данные.

Если этот параметр не указан для отсутствующих объектов, командлет возвращает ошибку.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-HostNameInCertificate

Имя узла используется для проверки TLS/SSL-сертификата SQL Server. Этот параметр необходимо передать, если экземпляр SQL Server включен для принудительного шифрования и вы хотите подключиться к экземпляру с помощью hostname/shortname. Если этот параметр опущен, для подключения к экземпляру SQL Server, включенного для принудительного шифрования, необходимо передать полное доменное имя (FQDN) в параметр -ServerInstance.

Этот параметр является новым в версии 22 модуля.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-IgnoreProviderContext

Указывает, что этот командлет не использует текущий контекст для переопределения значений параметров ServerInstance, DatabaseName, SchemaName и TableName . Если этот параметр не указан, командлет игнорирует значения этих параметров, если это возможно, в пользу контекста, в котором выполняется командлет.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputData

Указывает данные для записи в базу данных.

Типичными входными данными является System.Data.DataTable, но можно указать объекты System.Data.DataSet или System.Data.DateRow*.

Type:PSObject
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-InputObject

Задает массив объектов SQL Server Management Objects (SMO), представляющих таблицу, в которую записывает этот командлет.

Type:Table[]
Position:1
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Passthru

Указывает, что этот командлет возвращает объект SMO. Объект Table . Этот объект представляет таблицу, содержащую добавленные данные. С таблицей можно работать после операции записи.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Path

Указывает полный путь в контексте поставщика SQL таблицы, в которой этот командлет записывает данные.

Type:String[]
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-SchemaName

Указывает имя схемы для таблицы.

Если этот командлет выполняется в контексте базы данных или дочернего элемента базы данных, командлет игнорирует это значение параметра. Укажите параметр IgnoreProviderContext для командлета, чтобы использовать значение параметра SchemaName .

Командлет поддерживает кавыкание значения. Вам не нужно ставить кавычки или экранировать специальные символы.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ServerInstance

Указывает имя экземпляра SQL Server. Для экземпляра по умолчанию укажите имя компьютера. Для именованных экземпляров используйте формат ComputerName\InstanceName.

Если этот командлет выполняется в контексте базы данных или дочернего элемента базы данных, командлет игнорирует это значение параметра. Укажите параметр IgnoreProviderContext для командлета, чтобы использовать значение параметра ServerInstance в любом случае.

Type:String[]
Position:1
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-SuppressProviderContextWarning

Указывает, что этот командлет подавляет предупреждающее сообщение о том, что командлет использует контекст поставщика.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-TableName

Указывает имя таблицы, из которой считывается этот командлет.

Если этот командлет выполняется в контексте базы данных или дочернего элемента базы данных, командлет игнорирует это значение параметра. Укажите параметр IgnoreProviderContext для командлета, чтобы использовать значение параметра TableName в любом случае.

Командлет поддерживает кавыкание значения. Вам не нужно ставить кавычки или экранировать специальные символы.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Timeout

Задает значение времени ожидания (в секундах) для операции записи. Если значение не указано, командлет использует значение по умолчанию (обычно 30s). Чтобы избежать истечения времени ожидания, передайте 0. Время ожидания должно быть целым числом от 0 до 65535.

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-TrustServerCertificate

Указывает, будет ли канал зашифрован при обходе цепочки сертификатов для проверки доверия.

В версии 22 модуля по умолчанию используется $true значение (для совместимости с версией 21). В версии 23+ модуля значение по умолчанию будет "$false", что может привести к критическому изменению для существующих скриптов.

Этот параметр является новым в версии 22 модуля.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Входные данные

System.Management.Automation.PSObject

System.String[]

Microsoft.SqlServer.Management.Smo.Table[]