Write-SqlTableData

SQL 데이터베이스의 테이블에 데이터를 씁니다.

Syntax

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>]

Description

Write-SqlTableData cmdlet은 SQL 데이터베이스의 테이블에 데이터를 삽입합니다. 이 cmdlet은 다음 입력 형식을 다음과 같은 출력 형식으로 허용합니다.

  • System.Data.DataSet
  • System.Data.DataTable
  • System.Data.DateRow 개체
  • 개체 컬렉션

DataSet을 제공하는 경우 데이터 세트의 첫 번째 테이블만 데이터베이스에 기록됩니다.

이 cmdlet은 Windows PowerShell SQL 공급자와 함께 사용할 수 있습니다.

이 cmdlet은 현재 경로에서 서버, 데이터베이스, 스키마 및 테이블과 같은 정보를 유추할 수 있습니다.

이 cmdlet은 테이블이 존재할 것으로 예상합니다. 기본적으로 cmdlet은 해당 테이블에 데이터를 추가합니다.

Force 매개 변수를 지정하면 cmdlet은 데이터베이스, 테이블 스키마 및 테이블 자체를 포함하는 누락된 개체를 생성합니다. 이 사용량을 사용하면 데이터를 데이터베이스로 빠르게 전송할 수 있습니다. cmdlet은 데이터에서 테이블의 스키마를 유추합니다. 결과가 최적이 아닐 수 있습니다. 예를 들어 문자열은 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

이 예제에서는 시스템에서 실행되는 프로세스에 대한 정보를 가져오고 테이블에 씁니다.

현재 cmdlet은 에 MyServer\MyInstance데이터를 MyDatabase.dbo.TaskManagerDump 씁니다. Force 매개 변수를 지정하기 때문에 데이터베이스, 스키마 및 테이블이 없으면 이 cmdlet이 만듭니다.

예제 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 입력합니다.

마지막 명령은 Read-SqlTableData cmdlet을 사용하여 변수의 $Table 내용을 표시합니다.

예제 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 cmdlet에 직접 전달하도록 강제하는 것입니다. 그러면 대량 삽입(행 삽입으로 행보다 성능이 훨씬 더 높음)을 수행할 수 있습니다.

예제 4: 한 instance 데이터를 검색하고 다른 instance 데이터베이스 테이블에 푸시

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 cmdlet을 사용하여 한 instance 데이터베이스 파일 크기에 대한 정보를 가져오고 결과 행을 다른 instance SQL Server 데이터베이스에 삽입합니다. 이 예제에서는 동일한 컴퓨터의 SQL Server 인스턴스 간에 데이터를 이동하지만 인스턴스는 완전히 다른 두 서버에 있을 수 있습니다.

예제 5: Azure SQL Database의 기존 테이블(또는 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

이 예제에서는 SQL 인증과 함께 Write-SqlTableData cmdlet을 사용하는 방법을 보여줍니다. 대부분의 코드는 매개 변수를 통해 -InputOject cmdlet에 전달되는 데 필요한 개체(SMO Table대상 테이블을 나타내는 개체)를 만드는 데 필요한 ADO.Net SMO 상용구일 뿐입니다.

매개 변수

-AccessToken

사용자/암호 또는 Windows 인증 대신 SQL Server 인증하는 데 사용되는 액세스 토큰입니다.

예를 들어 또는 에 연결 SQL Azure DB 하고 를 사용하는 Service Principal 데 사용할 수 있습니다Managed IdentitySQL Azure Managed Instance.

사용할 매개 변수는 토큰을 나타내는 문자열이거나 PSAccessToken 를 실행 Get-AzAccessToken -ResourceUrl https://database.windows.net하여 반환된 개체일 수 있습니다.

이 매개 변수는 모듈의 v22에서 새로 추가되었습니다.

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

-ConnectionTimeout

시간 제한 오류가 발생하기 전에 서버 연결을 대기할 시간(초)을 지정합니다. 제한 시간 값은 0에서 65534 사이의 정수여야 합니다. 0을 지정하면 연결 시도 시간이 제한되지 않습니다.

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

-Credential

SQL Server 연결에 대한 PSCredential 개체를 지정합니다. 자격 증명 개체를 가져오려면 Get-Credential cmdlet을 사용합니다. 자세한 내용은 get-credential Get-Help 입력합니다.

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

-DatabaseName

테이블을 포함하는 데이터베이스의 이름을 지정합니다.

cmdlet은 값 따옴표 지정을 지원합니다. 특수 문자를 인용하거나 이스케이프할 필요가 없습니다.

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

-Encrypt

SQL Server 연결할 때 사용할 암호화 유형입니다.

이 값은 Encrypt Microsoft.Data.SqlClient 드라이버의 SqlConnection 개체에 있는 속성 SqlConnectionEncryptOption 에 매핑됩니다.

모듈의 v22에서 기본값은 (v21과의 호환성을 위해)입니다 Optional . 모듈의 v23 이상에서는 기본값이 '필수'이며 기존 스크립트에 대한 호환성이 손상되는 변경이 발생할 수 있습니다.

이 매개 변수는 모듈의 v22에서 새로 추가되었습니다.

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

-Force

이 cmdlet이 누락된 SQL Server 개체를 만든다는 것을 나타냅니다. 여기에는 데이터베이스, 스키마 및 테이블이 포함됩니다. 이러한 개체를 만들려면 적절한 자격 증명이 있어야 합니다.

누락된 개체에 대해 이 매개 변수를 지정하지 않으면 cmdlet에서 오류를 반환합니다.

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

-HostNameInCertificate

SQL Server TLS/SSL 인증서의 유효성을 검사할 때 사용할 호스트 이름입니다. 강제 암호화에 대해 SQL Server instance 사용하도록 설정되어 있고 hostname/shortname을 사용하여 instance 연결하려는 경우 이 매개 변수를 전달해야 합니다. 이 매개 변수를 생략하면 FQDN(정규화된 도메인 이름)을 -ServerInstance에 전달하여 강제 암호화를 사용하도록 설정된 SQL Server instance 연결해야 합니다.

이 매개 변수는 모듈의 v22에서 새로 추가되었습니다.

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

-IgnoreProviderContext

이 cmdlet은 현재 컨텍스트를 사용하여 ServerInstance, DatabaseName, SchemaNameTableName 매개 변수의 값을 재정의하지 않음을 나타냅니다. 이 매개 변수를 지정하지 않으면 cmdlet은 cmdlet을 실행하는 컨텍스트에 찬성하여 가능한 경우 이러한 매개 변수의 값을 무시합니다.

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

이 cmdlet이 쓰는 테이블을 나타내는 SMO(SQL Server Management Objects) 개체의 배열을 지정합니다.

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

-Passthru

이 cmdlet이 SMO를 반환한다는 것을 나타냅니다 . Table 개체입니다. 이 개체는 추가된 데이터를 포함하는 테이블을 나타냅니다. 쓰기 작업 후에 테이블에서 작업할 수 있습니다.

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

-Path

이 cmdlet이 데이터를 쓰는 테이블의 SQL 공급자 컨텍스트에서 전체 경로를 지정합니다.

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

-SchemaName

테이블의 스키마 이름을 지정합니다.

데이터베이스 또는 데이터베이스의 자식 항목 컨텍스트에서 이 cmdlet을 실행하는 경우 cmdlet은 이 매개 변수 값을 무시합니다. Cmdlet에 대해 IgnoreProviderContext 매개 변수를 지정하여 SchemaName 매개 변수의 값을 사용합니다.

cmdlet은 값 따옴표 지정을 지원합니다. 특수 문자를 인용하거나 이스케이프할 필요가 없습니다.

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

-ServerInstance

SQL Server instance 이름을 지정합니다. 기본 instance 컴퓨터 이름을 지정합니다. 명명된 인스턴스의 경우 형식 ComputerName\InstanceName을 사용합니다.

데이터베이스 또는 데이터베이스의 자식 항목 컨텍스트에서 이 cmdlet을 실행하는 경우 cmdlet은 이 매개 변수 값을 무시합니다. 어쨌든 ServerInstance 매개 변수의 값을 사용하도록 cmdlet에 대해 IgnoreProviderContext 매개 변수를 지정합니다.

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

-SuppressProviderContextWarning

이 cmdlet은 cmdlet이 공급자 컨텍스트를 사용한다는 경고 메시지를 표시하지 않습니다.

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

-TableName

이 cmdlet이 읽는 테이블의 이름을 지정합니다.

데이터베이스 또는 데이터베이스의 자식 항목 컨텍스트에서 이 cmdlet을 실행하는 경우 cmdlet은 이 매개 변수 값을 무시합니다. 어쨌든 TableName 매개 변수의 값을 사용하도록 cmdlet에 대해 IgnoreProviderContext 매개 변수를 지정합니다.

cmdlet은 값 따옴표 지정을 지원합니다. 특수 문자를 인용하거나 이스케이프할 필요가 없습니다.

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

-Timeout

쓰기 작업에 대한 제한 시간 값(초)을 지정합니다. 값을 지정하지 않으면 cmdlet은 기본값(일반적으로 30초)을 사용합니다. 시간 제한을 방지하려면 0을 전달합니다. 시간 제한은 0에서 65535 사이의 정수 값이어야 합니다.

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

-TrustServerCertificate

신뢰의 유효성을 검사하기 위해 인증서 체인을 건너뛰는 동안 채널이 암호화되는지 여부를 나타냅니다.

모듈의 v22에서 기본값은 (v21과의 호환성을 위해)입니다 $true . 모듈의 v23 이상에서 기본값은 '$false'이며, 이로 인해 기존 스크립트에 대한 호환성이 손상되는 변경이 발생할 수 있습니다.

이 매개 변수는 모듈의 v22에서 새로 추가되었습니다.

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[]