Sql-Server-2008-R2

xp_cmdshell 只發送字元串的第一個字元

  • May 8, 2020

我正在嘗試使用 xp_cmdshell 啟動一個帶有列表作為輸入的 python 腳本,但由於某種原因,它只將字元串的第一個字元傳遞給命令行。我從下面的程式碼中得到的結果是“‘D’ 不被辨識為內部或外部命令、可執行程序或批處理文件。”。如果我在路徑之前添加 START 命令,它只會將“D”替換為“S”。我試圖用連接到 241 個字元來測試這個特定的行,所以我不會碰到 xp_cmdshell 的 varchar 限制。在 Windows Server 2008R2 上使用 MSSQL 2008R2。

DECLARE
   @inspection varchar

SELECT
   @inspection = 'D:/Python27/ArcGISx6410.1/python.exe D:/GIS-DATA/Scripts/whydrant_update_01.py [''' + COALESCE(FACILITYID, '') + ''',''' + COALESCE(MAKER, '') + ''',''' + COALESCE(HYDRCOND, '') + ''',''' + COALESCE(BASECOL, '') + ''',''' + COALESCE(CAPCOL, '') + ''',''' + COALESCE(STEAMSIZE, '') + ''',''' + COALESCE(DISSIZE, '') + ''',''' + COALESCE(CAST(FLOW AS varchar), '') + ''',''' + COALESCE(CAST(PRESSURE AS varchar), '') + ''',''' + COALESCE(VALVELOC, '') + ''',''' + COALESCE(ACTIVE, '') + ''',''' + COALESCE(OPERABLE, '') + ''',''' + COALESCE(OPERHARD, '') + ''',''' + COALESCE(CORRODED, '') + ''',''' + COALESCE(CLEARING, '') + ''',''' + COALESCE(PAINTING, '') + ''',''' + COALESCE(MARKER, '') + ''',''' + COALESCE(NOTE, '') + ''',''' + COALESCE(CAST(created_date AS varchar), '') + ''',''' + COALESCE(USER_, '') + ''']'
FROM sde.sde.a1288
WHERE FACILITYID = '2294'


EXEC xp_cmdshell @inspection 

問題在於您的變數聲明varchar

command_stringvarchar(8000)或_nvarchar(4000)

所以定義你的變數以及適當的長度 以避免字元串截斷

聲明@inspection varchar

應該

聲明@inspection varchar(8000)

還有幾件事(因為我不知道 Python)。

  • 確保您列印或選擇@inspection並查看您可以成功執行生成的命令。
  • 使用變數表示成功或失敗,並在命令失敗時引發錯誤消息。

例如

declare @result int
DECLARE @inspection varchar(8000)  
exec @result = master..xp_cmdshell @inspection 
if @result <> 0
begin 
   print 'Python script errored out !!'
   RAISERROR ('Python script errored out', 16, 1)
end

引用自:https://dba.stackexchange.com/questions/160598