Invoke-Sqlcmd,InputFile和Variable

Sal*_*zio 9 sql-server powershell

我需要执行一个执行SQL脚本来创建数据库的powershell脚本.根据我的知识,我以这种方式执行powershell命令:

Init.ps1

$DATABASEFILENAME = "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008INSTANCE\MSSQL\DATA\myDB.mdf"
$DATABASELOGNAME = "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008INSTANCE\MSSQL\DATA\myDB_log.ldf"
$DBUSEROWNER = "domain\spsetup"
Run Code Online (Sandbox Code Playgroud)

CreateDatabase.ps1

 try {
        $createDatabaseScript = ($scriptsFolder,$eachRelease,$DeployEnvironment,"Config" -join "\") + "\JM SiteRequest Database.sql"
        $sqlVariable = "DATABASEFILENAME = '$DATABASEFILENAME'", "DATABASELOGNAME = '$DATABASELOGNAME'", "DBUSEROWNER = '$DBUSEROWNER'"

        Invoke-Sqlcmd -ServerInstance "$MySQLServer" -InputFile "$createDatabaseScript" -ErrorAction Stop -Variable $sqlVariable
}
catch [Exception] {
        Write-Error "Database error: $_.Exception"
}
Run Code Online (Sandbox Code Playgroud)

SQL脚本

CREATE DATABASE [SiteRequestDB] ON  PRIMARY
( NAME = N'SiteRequestDB', FILENAME = N'$(DATABASEFILENAME)' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON 
( NAME = N'SiteRequestDB_log', FILENAME = N'$(DATABASELOGNAME)' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
Run Code Online (Sandbox Code Playgroud)

我更新了$ sqlVariable,因为@Chad Miller建议.所以问题出现了.现在我收到此错误:创建数据库错误:数据库错误:对象或列名称丢失或为空.对于SELECT INTO语句,请验证每列是否具有名称.对于其他语句,请查找空别名.不允许使用定义为""或[]的别名.将别名更改为有效名称.标签'C'已经宣布.标签名称在查询批处理或存储过程中必须是唯一的.Exception.Exception

Cha*_*ler 8

cmdlet 的Variable参数Invoke-Sqlcmd很挑剔.在变量赋值之前或之后不要包含空格.

$sqlVariable = "DATABASEFILENAME='$DATABASEFILENAME'", "DATABASELOGNAME='$DATABASELOGNAME'", "DBUSEROWNER='$DBUSEROWNER'"
Run Code Online (Sandbox Code Playgroud)

您还需要从变量中删除单引号:

$sqlVariable = "DATABASEFILENAME=$DATABASEFILENAME", "DATABASELOGNAME=$DATABASELOGNAME", "DBUSEROWNER=$DBUSEROWNER"
Run Code Online (Sandbox Code Playgroud)

  • 在[MDSN的文档](https://msdn.microsoft.com/en-us/library/cc281720.aspx)中,给出的示例有单引号和空格,为什么呢?`$MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'" Invoke-Sqlcmd -Query "SELECT `$(MyVar1) AS Var1, `$(MyVar2) AS Var2;" -变量$MyArray` (2认同)