我需要执行一个执行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"
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"
}
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
我将@sqlVariable更新为@Chad Miller建议。 所以问题出现了。 现在我收到此错误:创建数据库错误:数据库错误:对象或列名称丢失或为空。对于SELECT INTO语句,请验证每列是否具有名称。对于其他语句,请查找空别名。别名定义为""或[]是不允许的。将别名更改为有效名称。 标签' C'已经宣布。标签名称在查询批处理或存储过程中必须是唯一的.Exception.Exception
答案 0 :(得分:7)
Variable
cmdlet的Invoke-Sqlcmd
参数非常挑剔。在变量赋值之前或之后不要包含空格。
$sqlVariable = "DATABASEFILENAME='$DATABASEFILENAME'", "DATABASELOGNAME='$DATABASELOGNAME'", "DBUSEROWNER='$DBUSEROWNER'"
您还需要从变量中删除单引号:
$sqlVariable = "DATABASEFILENAME=$DATABASEFILENAME", "DATABASELOGNAME=$DATABASELOGNAME", "DBUSEROWNER=$DBUSEROWNER"
答案 1 :(得分:1)
首先,指定错误消息(如果有)。
此外,无需定义日志和数据文件位置,尝试使用下面的代码段,它适用于许多项目。
$sqlServerName = "%your SQL server instance%" #for example, ".\SQLEXPRESS"
$file = "C:\yourScript.sql"
$database = "testDatabaseName"
$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $sqlServerName
Invoke-SqlCmd -inputfile $file -serverinstance $server -database $database