0

私は PowerShell を学んでいます。.CSVファイルを SQL Server データベースにインポートしようとするスクリプトを作成しましたが、次のクエリがテーブルを追加しているだけであることがわかりました。

$database = 'DATABASE'
$server = 'SERVER'
$table = 'TABLE'
Import-CSV \\TESTPATH\licenses_v2.csv  | 
ForEach-Object { 
Invoke-Sqlcmd -Database $database -ServerInstance $server -Query "insert into $table VALUES ('$($_.FirstName)','$($_.LastName)','$($_.Department)','$($_.Title)')" 
}

そのため、最初のTRUNCATEINSERTに、次の 2 つのスクリプトをテストしました。

$database = 'DATABASE'
$server = 'SERVER'
$table = 'TABLE'
Import-CSV \\TESTPATH\licenses_v2.csv | 
ForEach-Object { Invoke-Sqlcmd -Database $database -ServerInstance $server -Query "truncate table $table; insert into $table VALUES ('$($_.FirstName)','$($_.LastName)','$($_.Department)','$($_.Title)')" 
}

$database = 'DATABASE'
$server = 'SERVER'
$table = 'TABLE'
Invoke-Sqlcmd -Database $database -ServerInstance $server -Query "truncate table $table"
Import-CSV \\TESTPATH\licenses_v2.csv | 
ForEach-Object { Invoke-Sqlcmd -Database $database -ServerInstance $server -Query "insert into $table VALUES ('$($_.FirstName)','$($_.LastName)','$($_.Department)','$($_.Title)')" 
}

これらのスクリプトをテストした後、ページの上部にある元のスクリプトを使用すると、テーブルは.CSV挿入から同じ数のレコードを返しますが、現在はすべて空白であり、これら 2 つを個別にテストする前はそうではありませんでしたTRUNCATEスクリプト (ファイルの各レコードにはまだ同じ値があります):

ここに画像の説明を入力

PowerShell からオブジェクトをクエリすると、 select-object コマンドがすべての空のレコードを返すように見えます。

import-csv \\TestPath\licenses_v2.csv | select-object FirstName,Department,Title

ただし、Import-CSV は、ファイルに存在する値を返します。

Import-CSV \\TestPath\licenses_v2.csv

他の SQL ステートメントをテストしてリテラル SQL 文字列を挿入すると、 を使用してテーブルに書き込むことができるように見えますinvoke-sqlcmdが、(間違っている可能性があります) powershell がファイルから読み取っているオブジェクト値を何とか切り捨てました。値はまだファイルにあります。

どうにかして PowerShell を復元する必要がありますか、それともファイル システムを何らかの形で変更したのでしょうか?

また、次のスクリプトを使用して SQL からまったく同じファイルを照会できるため、明らかに値を読み取ることができますが、PowerShell スクリプトは何らかの理由で import-csv コマンドを使用して値を読み取ることができません。

CREATE TABLE #TempTable(
    [FirstName] [varchar](50) NULL,
    [LastName] [varchar](50) NULL,
    [Department] [varchar](150) NULL,
    [Title] [varchar](150) NULL
) 
   BULK INSERT #TempTable
    FROM '\\TestPath\licenses_v2.csv'
    WITH
(
  FIRSTROW = 2,
  DATAFILETYPE='char', 
  FIELDTERMINATOR = '|',
  ROWTERMINATOR = '\n',
  TABLOCK,
  KEEPNULLS -- Treat empty fields as NULLs.
)
go
select * from #TempTable

ここに画像の説明を入力

4

2 に答える 2