我正在尝试运行以下查询
sqlcmd -STEMP7 -E -devolive_base -w256
-QEXIT("DECLARE @r int EXEC @r = usp_AddToObservationtbl $,$,$ SELECT @r")
我试图让BAT文件向用户询问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
,只有在看到输出时才需要,如果您想自己尝试一下。
set /p batchvariable=Enter a number:_
sqlcmd -v sqlvariable=%batchvariable% -i test.sql
pause
SELECT $(sqlvariable) AS [result];
运行批处理文件时,这就是您得到的。
在实践中,批处理变量和SQL变量可能使用相同的名称。上面它们是不同的,以说明是什么。
如果需要执行此操作,则可能需要多个变量。您可以通过重复-v sqlvariablename=%batchvariablename%
的{{1}}部分来解决此问题,例如
sqlcmd
-v v1=%v1% -v v2=%v2%
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];
作为示例字段来运行示例并检查行为。