簡體   English   中英

SQLCMD。 如何傳入包含冒號和空格的變量?

[英]sqlcmd. How to pass in a variable that includes a colon and a space?

我一直在努力解決這個問題。 我正在嘗試調用sql腳本並使用sqlcmd將兩個變量傳遞給它。 我在PowerShell中做了這一切。

這是我得到的:

$time = '12:00 AM'
$date = '06/20/2014'
$result = sqlcmd -U username -P password -i "c:\path\to\script.sql" -v date=$date -v time=$time

此操作失敗,並顯示以下錯誤消息:

sqlcmd : Sqlcmd: 'time=12:00 AM': Invalid argument. Enter -? for help.

經過一些實驗,我發現問題是冒號和時間空間。 如果我刪除冒號和空格$time = '1200AM' ,該命令將執行而不會出現任何錯誤。

不幸的是,我正在執行的腳本需要確切的格式“12:00 AM”。

我嘗試過的東西不起作用:

$time="12\:00\ AM"
$time="12\\:00\\ AM"
$time="12"+":00"+" AM"
$time="12"+":00"
$time="12"+":"+"00"

這些都響應類似的Invalid argument失敗。 最后幾次嘗試是這個類似帖子的解決方案。 它們不起作用。

我也嘗試將字符串值直接放在sqlcmd調用中,如下所示:

$result = sqlcmd -U username -P password -i "c:\path\to\script.sql" -v date=$date -v time="12\:00\ AM". 

沒有骰子,無論如何,我需要從其他地方讀取時間,所以我需要$ time變量。

我(最后)找到了一個適用於Powershell腳本的sqlcmd的解決方案。 (使用invoke-sqlcmd不是我的選擇)

我需要在變量中傳遞包含冒號的絕對路徑(例如,C:\\ rootdir \\ subdir)。 這可以從常規的命令提示符開始,但我無法通過Powershell腳本使用它。 我想出了一個丑陋的kludge,在冒號之前和之后傳遞兩個變量中的部分,然后在SQL腳本中重新組裝它。

但是當路徑包含空格(例如,C:\\ root dir \\ subdir)時失敗。

所以我終於找到了解決冒號和空格的解決方案。 它包含用雙引號括起路徑文本,然后將雙引號路徑文本括在外部單引號集中。 在變量中構建完整的sqlcmd后,它看起來像這樣:

SQLCMD <other args>  -v RootPath='"C:\root dir\subdir"'

(這是一組外部單引號(')和一組內部雙引號(“))。

如果路徑沒有冒號,例如\\\\ nodename \\ root dir \\ subdir,這也有效。 當我試圖在假定的冒號周圍分割路徑時,這是一個問題。 我仍然不確定為什么外部單引號和內部雙引號都是必要的,但這是唯一適用於我的版本。

ADDENDUM:這只適用於Powershell 5,當我的腳本從Powershell 4運行時就崩潰了。為了使它在兩者上運行,我發現我需要用單引號括起內部空格,例如,

SQLCMD <other args>  -v RootPath='"C:\root' 'dir\subdir"'

好吧,我想出了一個解決方案。 希望它對將來的其他人有用。

我從sqlcmd切換到Powershell的Invoke-Sqlcmd。 這個STILL給了我一些問題,所以我不得不用它來搗亂。 這是我的最終結果。

# import Invoke-Sqlcmd
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100

$time = "12:01 AM"
$date = "07/22/2014"
$datetime = "time='$time'", "date='$date'" # save to $datetime as an array
$result = Invoke-Sqlcmd -Username username -Password password -InputFile "c:\path\to\sql\script.sql" -Variable $datetime

請注意以下內容不起作用:

$datetime = "time='"+$time+"'", "date='"+$date+"'"

這是我嘗試的第一件事,它導致了無效的參數異常。

我通過在每個變量賦值運算符之前和之后添加空格來稍微修改PowerShell腳本,如下所示:

$time = '12:00 AM'
$date = '06/20/2014'
$result = sqlcmd -U username -P password -i "c:\path\to\script.sql" -v date = $date -v time = $time

它適用於我(在PowerShell 2.0上測試)。

首先,我會嘗試-v "date=$date" -v "time=$time"

如果那不起作用,我試試這個:

$time = '12:00 AM'
$date = '06/20/2014'
$time = 'time=' + $time
$date = 'date=' + $date
$result = sqlcmd -U username -P password -i "c:\path\to\script.sql" -v $date -v $time

當PowerShell執行程序時,它會解析該行,解析其中的任何PowerShell,然后嘗試執行該字符串。 它最終感覺你需要一個額外的抽象層,你在傳統的shell腳本或批處理腳本中並沒有真正看到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM