2014-04-02 104 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现在工作......谢谢。标记为正确!惊讶我还没有被投票了...... ;-) –

相关问题