上回我們在PowerShell使用了命令列來讀取我們的.csv靜態檔案,不過對於檔案裡的資料來源,我們是直接在檔案裏面輸入資料來讓PowerShell讀取,今天我們來嘗試看看,將做為資料來源的靜態檔案以更方便的方式產生,假設我們的目的是把A資料庫中所有資料表以及資料內容遷移至B資料庫中,接下來我們一步一步的完成這項工作。
首先我們需要知道A資料庫裡的資料表作為我們匯出.sql腳本的物件,先使用sqlcmd進行查詢,並且這次我們將查詢結果匯出成另一種檔案型式-.txt,語法如下:
sqlcmd -S . -d FirstDataBase -Q "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES" -o C:\temp\TableName.txt
成功輸出檔案後,可以發現內容雖然有我們需要的物件資料,但是多了一些不必要的雜訊,我們加一些內容把不需要的內容一一砍掉,語法如下:
去除下方文字
sqlcmd -S . -d FirstDataBase -Q "SET NOCOUNT on;SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES" -o C:\temp\TableName.txt
去除表頭
sqlcmd -S . -d FirstDataBase -Q "SET NOCOUNT on;SELECT TABLE_NAME + '' FROM INFORMATION_SCHEMA.TABLES" -o C:\temp\TableName.txt
去除標線(利用findstr正則轉成另一個檔案,詳細請參考這裡)
sqlcmd -S . -d FirstDataBase -Q "SET NOCOUNT on;SELECT TABLE_NAME + '' FROM INFORMATION_SCHEMA.TABLES" -o C:\temp\TableName.txt
findstr /R /C:"^[^-]*$" C:\temp\TableName.txt > C:\temp\TableNameList.txt
接著我們建立變數去存取檔案的內容,並且看一下存取後的變數是否需要做調整,語法如下:
sqlcmd -S . -d FirstDataBase -Q "SET NOCOUNT on;SELECT TABLE_NAME + '' FROM INFORMATION_SCHEMA.TABLES" -o C:\temp\TableName.txt
findstr /R /C:"^[^-]*$" C:\temp\TableName.txt > C:\temp\TableNameList.txt
$TableNameList = Get-Content C:\temp\TableNameList.txt
$TableNameList.count
FOR($i=0;$i -lt $TableNameList.count;$i++)
{
$TableNameList[$i]
}
由上可以得知,我們存取後的變數在陣列第一個位置為空白,除去之後內容就符合我們需求,所以只需要將陣列起始值設為1即可得到我們的資料來源物件。
更多小知識,我們下次見~~