我有以下代碼:
USE MyFakeDB
GO
DECLARE @month VARCHAR(16)
SET @month = 'October2021'
;
DECLARE @cmd VARCHAR(8000)
, @sql NVARCHAR(max)
, @return INT
, @filepath VARCHAR(512)
, @servername VARCHAR(255) = @@ServerName
, @username VARCHAR(255) = 'me'
, @password VARCHAR(255) = 'password1234'
, @dbname VARCHAR(255) = 'MyFakeDB'
, @tablename VARCHAR(255) = 'Monthly_Insert'
, @folderpath VARCHAR(255) = 'E:\SomeData\Monthly'
, @filename VARCHAR(255) = '' @month '_Inserts.csv'
, @datadate NVARCHAR(255) = 'WHERE DataMonth = ''' @month ''''
;
SET @cmd = 'Invoke-Sqlcmd -Query ''SELECT Medium, RunDate, RunTime, UTCDate, UTCTime FROM ' @dbname '.dbo.' @tablename ' ' @datadate ';'' -Database ' @dbname ' -Server "' @servername '" -Username ' @username ' -Password ' @password
' | ConvertTo-Csv -NoTypeInformation | Set-Content -Path ' @folderpath '\' @filename ' -Encoding UTF8'
SET @cmd = 'powershell.exe -noprofile -command "' @cmd '"'
EXEC @return = xp_cmdshell @cmd, no_output
IF @return <> 0
BEGIN
PRINT 'ERROR: ' @cmd
END
;
GO
當我嘗試運行它時,我得到一個
錯誤:powershell.exe -noprofile -command blah blah blah
錯誤。如果我洗掉@datadate變數(實際上只是WHERE子句),它就可以正常作業。
我也嘗試在沒有WHERE子句變數的情況下這樣做,只寫文字字串,它仍然不起作用,這讓我相信它不喜歡有一個WHERE子句。
任何想法為什么?
謝謝,
uj5u.com熱心網友回復:
通過-command引數傳遞 powershell 腳本是出了名的棘手。
而是使用-command -which 指示 Powershell 從標準輸入讀取腳本,您可以使用<重定向運算子在 cmd.exe 中提供該腳本。
例如
SET @cmd = 'powershell.exe -noprofile -command - < ' @cmd
這還允許您發送多行 powershell 腳本,這些腳本更易于閱讀,例如
SET @cmd = 'Invoke-Sqlcmd -Query ''SELECT Medium, RunDate, RunTime, UTCDate, UTCTime FROM ' @dbname '.dbo.' @tablename ' ' @datadate ';'' -Database ' @dbname ' -Server "' @servername '" -Username ' @username ' -Password ' @password '
| ConvertTo-Csv -NoTypeInformation
| Set-Content -Path ' @folderpath '\' @filename ' -Encoding UTF8'
并且在除錯時總是在運行它之前列印你的 cmd,并且不要抑制輸出。
SET @cmd = 'powershell.exe -noprofile -command - < ' @cmd
print @cmd
EXEC @return = xp_cmdshell @cmd
IF @return <> 0
BEGIN
PRINT 'ERROR: ' @cmd
END
;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/414991.html
標籤:
上一篇:在SQL中計劃重繪
