2016-01-22 56 views
0

我一直在嘗試傳遞一個變量值,我可以在命令行中輸入以打開批處理文件,然後將該值傳遞給一個sql腳本。在這種情況下,我正在通過在命令行中設置它來將數據庫用戶的密碼更改爲新密碼。如何通過批處理文件將變量值從命令行傳遞到SQL腳本

命令行 - update_passwords.bat服務器名1234

批處理文件 -

@echo off 
set sql_server_name=%1 
set newPass=%2 

osql -S %1 -U dbuser -P user_pass -v newPass=%2 -i c:\sql_script -o c:\sql_log 

sql file - 

ALTER LOGIN user1 WITH PASSWORD = %2; 

我得到一個不正確的語法附近 '%' 的錯誤,當我運行的批處理文件

任何幫助非常感謝

+0

它看起來像你在頂部設置sql_server_name和newPass並從不使用它們。除此之外,你是否遇到了當前擁有的批處理文件錯誤?如果是這樣,那麼錯誤信息是什麼? – gmm

+0

im在命令行中指定服務器名稱並將其作爲%1傳遞給批處理文件,然後輸入密碼,我希望將db帳戶的密碼更改爲%2。我在'%'錯誤附近得到錯誤的語法。感謝您對我的看法 – MollyMoo

+0

您應該將有關錯誤消息的信息放入問題主體中。 – gmm

回答

1

有兩個主要問題。一個是%2c:\sql_script中不可用,所以SQL語句試圖從字面上將密碼設置爲「%2」。您可以通過在命令行而不是輸入文件中傳遞SQL語句來解決該問題。第二個問題是SQL語句需要引用%2。嘗試以下操作。

osql -S %1 -U dbuser -P user_pass -q "ALTER LOGIN user1 WITH PASSWORD = '%2';" -o c:\sql_log

現在,如果新密碼中有撇號,則需要通過將它們轉換爲加倍apostropes逃避它們。

鑑於您在設置變量後未使用sql_server_namenewPass變量,可以將它們完全刪除。這將消除shawnt00提到的安全問題。

+0

這似乎適用於我的快速測試:'... WITH PASSWORD ='%newpass:'=''%''您還需要清除密碼變量,以便以後沒有人可以看到它,可能使用'setlocal' 。 – shawnt00

+0

感謝所有幫助的人......上面提到的在osql命令中傳遞sql語句的建議不適用於我,因爲我需要更改大量數據庫用戶的密碼。對不起,我應該在開始時說清楚。所以-i文件中有一些ALTER語句。我可以在該輸入文件中設置新的密碼,但希望能夠從命令行傳遞新的密碼值..仍然不知道如何做到這一點/如果可能,但感謝您的幫助 – MollyMoo

相關問題