如何通过批处理文件将变量值从命令行传递到SQL脚本

问题描述:

我一直在尝试传递一个变量值,我可以在命令行中输入以打开批处理文件,然后将该值传递给一个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

有两个主要问题。一个是%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