2012-01-04 3 views
2

SQL Server의 간단한 저장 프로 시저에서 데이터를 가져 오는 데 어려움이 있습니다. 3 열에서 변수를 채워야하는 Powershell 스크립트가 있습니다 (프로 시저에서 1 행만 반환)Powershell을 사용하여 SQL Server 2008에서 데이터 가져 오기

다음은 내가 작동하지 않는 기능입니다. 어떻게 든 열 값을 올바르게 참조하지 않습니다. 다양한 방법을 시도했지만 일반적으로 "null 배열로 색인을 생성 할 수 없습니다"오류가 발생합니다. 나는 결과 집합을 반복하고 싶지 않아, 난 그냥 직접 한 행에서 일부 값을 설정하려면 내가 너무, 가능하면 열 이름을 사용하려는 변수

$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection 
$conn.ConnectionString = ` 
    "Server=ServerName;Database=ShopDB;Integrated Security=True" 
$sqlQuery = new-object System.Collections.Specialized.StringCollection 
$sqlQuery.Add("JobSettingsGet") 
$Resultset = $conn.ExecuteWithResults($sqlQuery) 

# $UserName = $table.Rows(0).Columns(0) 
    # error - Method invocation failed because [System.Data.DataTable] doesn't 
    # contain a method named 'Rows'. 
# $UserName = $table.Rows[0].Columns[0] 
    # error - cannot index null array 
# $UserName = $table.Row(0).Column(0) 
    # error - Cannot index into a null array, also Method invocation failed 
    # because [System.Data.DataTable] doesn't contain a method named 'Row'. 
# $UserName = $table.Rows[0].Columns[1].Value 
    # error - cannot index null array 

로 돌아왔다.

모든 포인터?

덕분에, 실비아

당신은 전체 테이블을 인쇄하려면 대신 SqlServer.Management 클래스

$conn = New-Object Data.Sqlclient.Sqlconnection` 
    ("Data Source=DATABASE;Initial Catalog=master;Integrated Security=SSPI;") 
$adapter = New-Object Data.Sqlclient.Sqldataadapter("exec sp_who2", $conn) 
$set = new-object data.dataset 
$adapter.fill($set) 
$table = new-object data.datatable 
$table = $set.tables[0] 

System.Data.SqlClient.SqlConnection를 사용할 수

답변

5

단지에 의해 열을 얻으려면 format-table

$table | ft -AutoSize 

를 사용 이름, foreach 반복자를 사용하고 이름 속성에 액세스

$table | % {$_.login} 

Ed : SqlServer.Management를 사용하여 동일한 쿼리가 있습니다.

[void][Reflection.Assembly]::LoadWithPartialName` 
    ("Microsoft.SqlServer.ConnectionInfo") 
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection 
$conn.ConnectionString = ` 
    "Server=ServerName;Database=ShopDB;Integrated Security=True" 
$sqlQuery = new-object System.Collections.Specialized.StringCollection 
$sqlQuery.Add("exec sp_who2") 
$resultset = $conn.ExecuteWithResults($sqlQuery) 

액세스 이름으로 정보를

$resultset[0].tables.Item(0).Rows[0].Item("Login") 
+0

감사 제로 번째 결과 집합, 제로 번째 테이블, 제로 번째 행과 항목을 따기에 의한 결과. db에 연결할 수 있으며 foreach 반복자를 사용합니다. 그러나, 내가하고 싶은 것은 (3 열만있는 행이 하나 있다는 것을 알고 있기 때문에) 실제 데이터를 반복하지 않고 변수에 넣습니다. 다음과 같은 내용 ("null 배열로 색인을 생성 할 수 없습니다"오류 메시지가 나타남) : $ 135.Builder.Columns [0] – Sylvia

+0

$ table.rows [0] System.Data가되어야합니다. Columns 멤버가없는 DataRow. item() 메소드를 사용해보십시오 : $ table.Rows [0] .item ("Login"). – vonPryz

+0

감사합니다. 이제 작동합니다. 다른 데이터 액세스 방법 (ExecuteWithResults 등) 대신 sqldataadapter를 사용하는 것이 가장 좋은 시점에 대한 의견 – Sylvia

관련 문제