2013-01-23 49 views
1

我有執行SQLCMD爲目錄中的每個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" 

但是這兩種解決方案都不能正常工作。在這種情況下該做什麼?

回答

1

the manual

-i輸入_文件 [,輸入_文件2 ...]

標識包含一批SQL語句或存儲過程的文件。 [...] -i和-Q/-q選項是互斥的

所以你不能這樣使用sqlcmd。但是,您可以使用osql實用程序來代替,但似乎沒有此限制,但是,如果在任一解決方案中只用osql替換所有sqlcmd條目,它仍然不起作用。

由於EXECUTE AS(當前會話或當前模塊)的範圍或直到執行REVERT,您的第二種方法將不起作用。由於osql的每次調用都會啓動一個新的會話,因此與您的腳本分開呼叫EXECUTE AS不會對它們產生任何影響。

第一種解決方案不起作用,因爲osql將在-i腳本之前執行兩個-q命令。因此,您將有效地將的執行上下文恢復爲之前的腳本。

但是,您不必在每個腳本執行結束時明確呼叫REVERT。所以,只需要你的第一個解決方案,用osql替換sqlcmd,刪除-q "REVERT"位,然後繼續。

+0

嗨安德烈,我也試過,但我得到的消息,-q和-i是互斥的... – Doki

+0

當我在SQL Server 2008 R2 Express上測試時,我沒有得到那種印象。但是,我不得不使用'osql'而不是'sqlcmd',因爲我測試的用戶是無密碼的,'sqlcmd'對於無密碼的用戶不適用。也許你可以嘗試'osql'? –

+0

我試了一次。現在沒有得到相互排斥的消息,但獲得了與文本的DOS提示符:1> – Doki