1

我有一个批处理文件为目录中的每个 sql 文件执行 SQLCMD:

for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U user -P password -E -i"%%G"

但是我必须使用模拟,我不想在每个文件中都有这个行。我尝试了 2 种可能的解决方案。

解决方案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"

但这两种解决方案都不起作用。在这种情况下该怎么办?

4

1 回答 1

1

手册

-i input_file [, input_file2 ...]

标识包含一批 SQL 语句或存储过程的文件。[...] -i 和 -Q/-q 选项是互斥的

所以你不能sqlcmd以这种方式使用。但是您可以改用该osql实用程序,它似乎没有此限制,但是,如果您只是将所有sqlcmd条目替换osql为任一解决方案中的所有条目,它仍然无法正常工作。

您的第二种方法不起作用,因为 的范围EXECUTE AS是当前会话或当前模块,或者直到REVERT执行。由于每次调用osql都会启动一个新会话,EXECUTE AS因此与脚本分开调用不会对它们产生任何影响。

第一个解决方案不起作用,因为会在脚本之前osql执行这两个-q命令。-i因此,您将有效地更改执行上下文并将其恢复到脚本之前。

但是,您不需要REVERT在每个脚本的执行结束时显式调用。因此,只需采用您的第一个解决方案,替换sqlcmdosql,移除-q "REVERT"钻头并使用剩余的东西。

于 2013-01-23T13:45:32.653 回答