2014-04-02 103 views
3

我有一個調用SQL腳本的Power-shell腳本。這是目前正在工作,但在我的SQL腳本中,我有一些硬編碼的參數,我想通過PowerShell傳遞給SQL腳本。如何通過Powershell將參數傳遞給SQL腳本

所以這是剪斷,它從Power-shell腳本

function ExecSqlScript([string] $scriptName) 
{ 
$scriptFile = $script:currentDir + $scriptName 
$sqlLog = $script:logFileDir + $scriptName + "_{0:yyyyMMdd_HHmmss}.log" -f (Get-Date) 
$result = sqlcmd -S uk-ldn-dt270 -U sa -P passwordhere3! -i $scriptFile -b | Tee-Object -    filepath $sqlLog 

if ($result -like "*Msg *, Level *, State *" -Or $result -like "*Sqlcmd: Error:*") 
    { 
    throw "SQL script " + $scriptFile + " failed: " + $result 
    } 
} 

try 
{ 
    ExecSqlScript "restoreDatabase.sql" 
} 
catch 
{ 
//Some Error handling here 
} 

這是從SQL

USE MASTER 
GO 
DECLARE @dbName varchar(255) 
SET @dbName = 'HardCodedDatabaseName' 

所以我想通過對DBNAME價值,任何想法?

回答

3

以防萬一別人需要這樣做...這是一個工作的例子。

電源Shell腳本:

sqlcmd -S uk-ldn-dt270 -U sa -P 1NetNasdf£! -v db = "'DatabaseNameHere'" -i $scriptFile -b | Tee-Object -filepath $sqlLog 

注-v開關將變量分配

這裏是MS SQL:

USE MASTER 
GO 

if db_id($(db)) is null 

BEGIN 
    EXEC(' 
    RESTORE DATABASE ' + $(db) + ' 
    FROM DISK = ''D:\DB Backup\EmptyLiveV5.bak'' 
    WITH MOVE ''LiveV5_Data'' TO ''C:\Program Files (x86)\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\LiveV5_' + $(db) + '.MDF'', 
    MOVE ''LiveV5_Log'' To ''C:\Program Files (x86)\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\LiveV5_' + $(db) + '_log.LDF'', REPLACE, 
    STATS =10') 
END 

注意:您不必分配該腳本可以像這樣變成一個普通的sql變量。

SET @dbName = $(db) 

你可以在你的sql代碼中使用它。 - 快樂的編碼。

+1

最好使用sql變量,因爲這有助於防止SQL注入 – Tbonechk27

5

您可以利用sqlcmd的scripting variables。這些可以在腳本文件中使用,並標記爲$()。像這樣,

-- Sql script file 
use $(db); 
select someting from somewhere; 

當調用sqlcmd,使用-v參數賦值的變量。像這樣,

sqlcmd -S server\instance -E -v db ="MyDatabase" -i s.sql 

編輯

心靈的SQL語法設置變量時。請看下面的代碼:

DECLARE @dbName varchar(255) 
SET @dbName = $(db) 
select 'val' = @dbName 

傳遞給SQL服務器,它看起來像這樣(探查幫助這裏):

use master; 

DECLARE @dbName varchar(255) 
SET @dbName = foo 
select 'val' = @dbName 

這很明顯是無效語法,因爲SET @dbName = foo不會使很有道理。價值應該是這樣的單引號內,

sqlcmd -S server\instance -E -v db ="'foo'" -i s.sql 
+0

好吧,這是我的SQL看起來像現在>> SET @dbName = $(db)和Powershell腳本> $結果= sqlcmd -S uk-ldn-dt270 -U sa -P jjj88J! -v db =「LiveV5_V2_Integration_Ayo」-i $ scriptFile -b | Tee-Object -filepath $ sqlLog,現在我得到一個無效的列錯誤,它說無效列是我想通過的值..hmmm –

+0

@ user2537315您缺少單引號。查看更新的帖子。 – vonPryz

+0

@vonPrzy現在工作......謝謝。標記爲正確!驚訝我還沒有被投票了...... ;-) –

相關問題