我有一个批处理文件,为目录中的每个sql文件执行SQLCMD:
for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U user -P password -E -i"%%G"
但我必须使用模拟,我不想在每个文件中都有这一行。我尝试了两种可能的解决方案。
解决方案1:
for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U user -P password -E -q "EXECUTE AS LOGIN = 'user2'" -i"%%G" -q "REVERT"
解决方案2:
sqlcmd /S servername /d databaseName -U user -P password -E -q "EXECUTE AS LOGIN = 'user2'"
for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U user -P password -E -i"%%G"
sqlcmd /S servername /d databaseName -U user -P password -E -q "REVERT"
但两种解决方案都不起作用。在这种情况下该怎么办?
答案 0 :(得分:1)
来自the manual:
-i input_file [, input_file2 ...]
标识包含一批SQL语句或存储过程的文件。 [...] -i和-Q / -q选项是互斥的。
所以你不能以这种方式使用sqlcmd
。但您可以使用osql
实用程序,但似乎没有此限制,但是,如果您只是在任一解决方案中用sqlcmd
替换所有osql
条目,它仍然不行。
由于EXECUTE AS
的范围是当前会话或当前模块,或者直到REVERT
被执行,因此第二种方法无效。由于osql
的每次调用都会启动一个新会话,因此与脚本分开调用EXECUTE AS
不会对它们产生任何影响。
第一个解决方案不起作用,因为osql
将在-q
脚本之前执行两个-i
命令。因此,您可以在脚本之前有效地更改执行上下文和将其还原为。
但是,您不需要在每个脚本执行结束时显式调用REVERT
。因此,只需采用您的第一个解决方案,将sqlcmd
替换为osql
,删除-q "REVERT"
位并继续使用剩下的内容。