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

标签 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
}

这是来自 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/

相关文章:

sql - 如何显式调用 TIBDataSet.RefreshSQL

mysql - 两种情况下复杂的重复行删除任务

linux - 了解 xargs 选项 -i 和 -t

linux - 如何在 bash 脚本中排序?

powershell - 什么是DIR命令在PowerShell中的替代品

powershell - 如果出现错误,请跳至Powershell中的下一个(Microsoft Teams)

sql - 使用第三个表将另一个表中的行插入到一个表中

sql - mysql查询计划中的意外索引扫描

linux - 用于提取特定日期日志的 shell 脚本

powershell - 如何为PowerShell格式化表格的输出着色