如何通过Powershell将参数传递给SQL脚本

Ayo*_*ina 5 sql shell powershell

我有一个调用SQL脚本的Power-shell脚本.这当前有效,但在我的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
}
Run Code Online (Sandbox Code Playgroud)

这是来自SQL

USE MASTER
GO
DECLARE @dbName varchar(255)
SET @dbName = 'HardCodedDatabaseName'
Run Code Online (Sandbox Code Playgroud)

所以我想传递dbName的值,任何想法?

von*_*ryz 10

您可以利用sqlcmd的脚本变量.这些可以在脚本文件中使用并标记为$().像这样,

-- Sql script file
use $(db);
select someting from somewhere;
Run Code Online (Sandbox Code Playgroud)

调用时sqlcmd,使用-v参数分配变量.像这样,

sqlcmd -S server\instance -E -v db ="MyDatabase" -i s.sql
Run Code Online (Sandbox Code Playgroud)

编辑

设置变量时请注意Sql语法.请考虑以下脚本:

DECLARE @dbName varchar(255)
SET @dbName = $(db)
select 'val' = @dbName
Run Code Online (Sandbox Code Playgroud)

传递给Sql Server,它看起来像这样(Profiler在这里帮助):

use master;

DECLARE @dbName varchar(255)
SET @dbName = foo
select 'val' = @dbName
Run Code Online (Sandbox Code Playgroud)

这显然是无效的语法,因为SET @dbName = foo没有多大意义.该值应该在单引号内,如此

sqlcmd -S server\instance -E -v db ="'foo'" -i s.sql
Run Code Online (Sandbox Code Playgroud)

  • @user2537315 您缺少单引号。请参阅更新的帖子。 (2认同)

Ayo*_*ina 4

以防万一其他人需要这样做......这是一个工作示例。

\n\n

电源外壳脚本:

\n\n
sqlcmd -S uk-ldn-dt270 -U sa -P 1NetNasdf\xc2\xa3! -v db = "\'DatabaseNameHere\'" -i $scriptFile -b | Tee-Object -filepath $sqlLog\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意 -v 开关来分配变量

\n\n

这是 MS SQL:

\n\n
USE MASTER\nGO\n\nif db_id($(db)) is null\n\nBEGIN\n    EXEC(\'\n    RESTORE DATABASE \' + $(db) + \'\n    FROM DISK = \'\'D:\\DB Backup\\EmptyLiveV5.bak\'\'\n    WITH MOVE \'\'LiveV5_Data\'\' TO \'\'C:\\Program Files (x86)\\Microsoft SQL Server\\MSSQL11.MSSQLSERVER\\MSSQL\\DATA\\LiveV5_\' + $(db) + \'.MDF\'\',\n    MOVE \'\'LiveV5_Log\'\' To \'\'C:\\Program Files (x86)\\Microsoft SQL Server\\MSSQL11.MSSQLSERVER\\MSSQL\\DATA\\LiveV5_\' + $(db) + \'_log.LDF\'\', REPLACE,\n    STATS =10\')\nEND\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:您不必像这样将脚本变量分配给普通的 sql 变量。

\n\n
SET @dbName = $(db)\n
Run Code Online (Sandbox Code Playgroud)\n\n

你可以在你的sql代码中使用它。- 快乐编码。

\n

  • 最好使用 sql 变量,因为这有助于防止 sql 注入 (3认同)