【问题标题】:sql command in powershell scriptpowershell脚本中的sql命令
【发布时间】:2015-03-31 14:24:03
【问题描述】:

提前感谢您抽出宝贵时间查看我遇到的这个问题。

我正在尝试简化将 UPS 跟踪号上传到我们的 ERP 系统的流程。基本上,我正在尝试将所有进程合并到一个 powershell 脚本中。我正在挂断 sql 部分以更新我们的 ERP。 sql 代码本身在通过 SQL 管理工作室运行时可以工作,因为它是我们当前程序的一部分,但是当嵌入到 powershell 中时,它会出错。

基本逻辑如下:

  1. 按摩 4 个 csv 文件(我们从每个仓库发货一个)
  2. 执行 4 个 sql 查询

在我的代码中,我按摩了 4 个有效的文件,为了进行测试,我做了几个测试查询,只是为了查看 sql 连接是否正常。您将看到实际返回数据的 select 语句。

错误:

**The 'from' keyword is not supported in this version of the language.
At C:\Users\dallan\desktop\sqltest3.ps1:56 char:8
+    FROM <<<<  'D:`\Work`\COSTCA`\CSV`\trackcal.csv'
+ CategoryInfo          : ParserError: (:) [], ParseException    
    + FullyQualifiedErrorId : FromKeywordNotAllowed**

脚本:

#CALGARY


[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackcalgp.csv").replace("89400","0089400") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackcal1.csv" -Encoding ascii –Force
[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackcal1.csv").replace(".0","") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackcal2.csv" -Encoding ascii –Force
[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackcal2.csv").replace('"',"") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackcal.csv" -Encoding ascii –Force
$text = [IO.File]::ReadAllText("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackcal.csv")
[IO.File]::WriteAllText("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackcal.csv", $text.TrimEnd())



#MONTREAL

[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackmtlgp.csv").replace("89400","0089400") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackmtl1.csv" -Encoding ascii –Force
[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackmtl1.csv").replace(".0","") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackmtl2.csv" -Encoding ascii –Force
[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackmtl2.csv").replace('"',"") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackmtl.csv" -Encoding ascii –Force
$text = [IO.File]::ReadAllText("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackmtl.csv")
[IO.File]::WriteAllText("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackmtl.csv", $text.TrimEnd())

#TORONTO

[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\tracktorgp.csv").replace("89400","0089400") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\tracktor1.csv" -Encoding ascii –Force
[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\tracktor1.csv").replace(".0","") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\tracktor2.csv" -Encoding ascii –Force
[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\tracktor2.csv").replace('"',"") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\tracktor.csv" -Encoding ascii –Force
$text = [IO.File]::ReadAllText("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\tracktor.csv")
[IO.File]::WriteAllText("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\tracktor.csv", $text.TrimEnd())

#VANCOUVER

[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackvangp.csv").replace("89400","0089400") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackvan1.csv" -Encoding ascii –Force
[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackvan1.csv").replace(".0","") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackvan2.csv" -Encoding ascii –Force
[io.file]::readalltext("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackvan2.csv").replace('"',"") | Out-File "`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackvan.csv" -Encoding ascii –Force
$text = [IO.File]::ReadAllText("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackvan.csv")
[IO.File]::WriteAllText("`\`\DYNAMICS`\D`$`\Work`\COSTCA`\CSV`\trackvan.csv", $text.TrimEnd())



#UPLOAD

$SQLServer = "DYNAMICS" #use Server`\Instance for named SQL instances! 
$SQLDBName = "RDOT"
$SqlQuery1 = @"
CREATE TABLE #Tmp_TRACK
  `( 
    `[CSTPONBR`] `[char`]`(21`) NOT NULL,
    `[Tracking_Number`] `[char`]`(41`) NOT NULL
  `)
     CREATE TABLE #Tmp_TRACK1
  `( 
    `[SOPNUMBE`] `[char`]`(21`) NOT NULL,
    `[CSTPONBR`] `[char`](21) NOT NULL,
    `[Tracking_Number`] `[char`]`(41`) NOT NULL
  `)

BULK INSERT #Tmp_TRACK
   FROM 'D:`\Work`\COSTCA`\CSV`\trackcal.csv' 
   WITH `(
      FIRSTROW = 2,
      DATAFILETYPE='char',
      FIELDTERMINATOR=','
   `); 

INSERT INTO #Tmp_TRACK1
    SELECT 
        SOP10100.SOPNUMBE,
        #Tmp_TRACK.CSTPONBR,
        #Tmp_TRACK.Tracking_Number
    FROM 
        SOP10100 INNER JOIN
        #Tmp_TRACK ON
        SOP10100.CSTPONBR = #Tmp_TRACK.CSTPONBR AND
        SOP10100.SOPTYPE = 3

INSERT INTO SOP10107 `(SOPNUMBE, SOPTYPE, Tracking_Number`) 
    SELECT SOPNUMBE, 3, TRACKING_NUMBER FROM #Tmp_TRACK1

select * from sop10107 where sopnumbe in `(SELECT SOPNUMBE from SOP10100 where SOPTYPE = 3 and CUSTNMBR = 'COSTCA' and DOCDATE = CONVERT`(Datetime, FLOOR(CONVERT`(float,GETDATE`(`)`)`)`)`)

drop table #TMP_TRACK

drop table #TMP_TRACK1
"@

$SqlQuery2 = "select * from IV00101 where ITEMNMBR = 'B16P'"
$SqlQuery3 = "select * from IV00101 where ITEMNMBR = 'B16P'"
$SqlQuery4 = "select * from IV00101 where ITEMNMBR = 'B16P'"
$SqlQuery5 = "select * from IV00101 where ITEMNMBR = 'B16P'"

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = False; User ID = sa; Password = mypassword"

$SqlCmd1 = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd2 = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd3 = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd4 = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd5 = New-Object System.Data.SqlClient.SqlCommand

$SqlCmd1.CommandText = $SqlQuery1
$SqlCmd2.CommandText = $SqlQuery2
$SqlCmd3.CommandText = $SqlQuery3
$SqlCmd4.CommandText = $SqlQuery4
$SqlCmd5.CommandText = $SqlQuery5

$SqlCmd1.Connection = $SqlConnection
$SqlCmd2.Connection = $SqlConnection
$SqlCmd3.Connection = $SqlConnection
$SqlCmd4.Connection = $SqlConnection
$SqlCmd5.Connection = $SqlConnection

$SqlAdapter1 = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter2 = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter3 = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter4 = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter5 = New-Object System.Data.SqlClient.SqlDataAdapter

$SqlAdapter1.SelectCommand = $SqlCmd1
$SqlAdapter2.SelectCommand = $SqlCmd2
$SqlAdapter3.SelectCommand = $SqlCmd3
$SqlAdapter4.SelectCommand = $SqlCmd4
$SqlAdapter5.SelectCommand = $SqlCmd5

$DataSet1 = New-Object System.Data.DataSet
$DataSet2 = New-Object System.Data.DataSet
$DataSet3 = New-Object System.Data.DataSet
$DataSet4 = New-Object System.Data.DataSet
$DataSet5 = New-Object System.Data.DataSet

$SqlAdapter1.Fill($DataSet1)
$SqlAdapter2.Fill($DataSet2)
$SqlAdapter3.Fill($DataSet3)
$SqlAdapter4.Fill($DataSet4)
$SqlAdapter5.Fill($DataSet5)


$SqlConnection.Close()

#next line is a pause

$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

clear

$DataSet1.Tables[0]
$DataSet2.Tables[0]
$DataSet3.Tables[0]
$DataSet4.Tables[0]
$DataSet5.Tables[0]

如您所见,我逃脱了许多我认为 powershell 会吓坏的字符。如果部分问题与此有关,我不会感到惊讶。

非常感谢任何帮助!

【问题讨论】:

标签: sql sql-server tsql powershell scripting


【解决方案1】:

\(/)[/] 不需要转义。去掉所有这些,因为它有点令人困惑,并且可能容易出错。

但是您收到的错误表明不支持 from 关键字(看起来这与您正在使用的 BULK INSERT 语句有关。这是什么版本的 SQL Server?

【讨论】:

  • 我删除了 \、(,)、[ 和 ] 的转义字符。这是我现在收到的错误:
  • 表达式或语句中出现意外标记“NOT”。在 C:\Users\dallan\desktop\sqltest4.ps1:45 char:30 + [CSTPONBR] [char](21) NOT
  • 这是 SQL Server 2008 R2
  • 试着去掉[char]的方括号,看看syntax for CREATE TABLE
  • 如果我将查询复制/粘贴到 SSMS 中,它可以工作。我还应该删除方括号吗?
猜你喜欢
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 2021-09-13
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多