获取.BAT文件或SQLCMD以提示用户输入

时间:2011-07-11 15:52:01

标签: sql sql-server-2008 batch-file sqlcmd

我正在尝试运行以下查询

sqlcmd -STEMP7 -E -devolive_base -w256
    -QEXIT("DECLARE @r int EXEC @r = usp_AddToObservationtbl $,$,$ SELECT @r")

我试图让BAT文件向用户询问3个变量....有人可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

您可以使用set /p获取变量:

set /p var1=Enter variable 1
set /p var2=Enter variable 2
set /p var3=Enter variable 3

...然后在命令行中使用它们:

sqlcmd -STEMP7 -E -devolive_base -w256 -QEXIT("DECLARE @r int EXEC @r = usp_AddToObservationtbl %var1%,%var2%,%var3% SELECT @r")

请记住,这仍然会让您对SQL注入攻击或某些进入破坏性攻击的人开放。

答案 1 :(得分:0)

感谢评论人员。

问题似乎是我的SQLCMD语法不正确,但它没有抛出错误,如果我用osql替换它,变量替换确实有效。所以这很好用

set /p var1= Enter Userid
set /p var2= Enter Casino Name  
set /p var3= Enter Screename 

osql -STEMP7 -E -devolive_base -w256 -QEXIT("DECLARE @r int EXEC @r = usp_AddToObservationtbl %var1%,%var2%,%var3% SELECT @r") -b -oc:\bat\observation.log
exit errorlevel

答案 2 :(得分:0)

这是一个简单的示例,其中解决了基本问题,并删除了实际查询的详细信息。

我删除了更改Windows提示符的命令和关闭回显的命令,因为这些命令只是用于美化输出,而不是解决方案的一部分。我还在数据输入提示中使用了下划线,通常您会在其中使用空格,以便可以看到它。我在bat文件的末尾留下了一个pause,只有在看到输出时才需要,如果您想自己尝试一下。

test.bat

set /p batchvariable=Enter a number:_
sqlcmd -v sqlvariable=%batchvariable% -i test.sql
pause

test.sql

SELECT $(sqlvariable) AS [result];

运行批处理文件时,这就是您得到的。

Result

在实践中,批处理变量和SQL变量可能使用相同的名称。上面它们是不同的,以说明是什么。

如果需要执行此操作,则可能需要多个变量。您可以通过重复-v sqlvariablename=%batchvariablename%的{​​{1}}部分来解决此问题,例如

sqlcmd

test.bat

-v v1=%v1% -v v2=%v2%

test.sql

set /p item=Item : 
set /p cost=Cost : 
sqlcmd -v item="%item%" -v cost=%cost% -i test.sql

请注意,在第二个示例中添加了引号(用于字符串数据),而在第一个示例中未出现(仅包含数字数据)。

您可能希望使用SELECT '$(item)' AS [item], $(cost) AS [cost]; 作为示例字段来运行示例并检查行为。

Another example