我有一个调用 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
}
这是来自 SQL
USE MASTER
GO
DECLARE @dbName varchar(255)
SET @dbName = 'HardCodedDatabaseName'
所以我想传递 dbName 的值,有什么想法吗?
最佳答案
您可以利用 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 Server 时,它看起来像这样(Profiler 在这里有帮助):
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
关于sql - 如何通过Powershell将参数传递给SQL脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22811357/