![](/img/trans.png)
[英]Need help getting Invoke-Sqlcmd, -InputFile & -Variable working nicely together
[英]Invoke-Sqlcmd, InputFile, and Variable
我需要執行 powershell 腳本,該腳本執行 SQL 腳本來創建數據庫。 根據我的知識,我以這種方式執行 powershell 命令:
初始化.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"
創建數據庫.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
我按照@Chad Miller 的建議更新了 $sqlVariable。 所以問題就在那里。 現在我收到此錯誤:創建數據庫錯誤:數據庫錯誤:object 或列名丟失或為空。 對於 SELECT INTO 語句,驗證每一列都有一個名稱。 對於其他語句,請查找空別名。 不允許使用定義為 "" 或 [] 的別名。 將別名更改為有效名稱。 label 'C' 已經被宣布。 Label 名稱在查詢批處理或存儲過程中必須是唯一的..Exception.Exception
Invoke-Sqlcmd
cmdlet的Variable
參數很挑剔。 在變量賦值之前或之后不要包含空格。
$sqlVariable = "DATABASEFILENAME='$DATABASEFILENAME'", "DATABASELOGNAME='$DATABASELOGNAME'", "DBUSEROWNER='$DBUSEROWNER'"
您還需要從變量中刪除單引號:
$sqlVariable = "DATABASEFILENAME=$DATABASEFILENAME", "DATABASELOGNAME=$DATABASELOGNAME", "DBUSEROWNER=$DBUSEROWNER"
首先,指定錯誤消息(如果有)。
此外,無需定義日志和數據文件位置,嘗試使用下面的代碼段,它在許多項目中適用於我。
$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
我知道這很舊,沒有任何真正好的解釋/示例,所以我發布了這個答案。
錯誤是由 TSQL 腳本生成的,在命令變量替換發生后,數據文件名和日志文件名的值周圍有兩個單引號。 這是由於包含單引號的變量值和 TSQL 腳本使用的變量也包含在單引號中。 命令變量並不那么挑剔,解析器不知道如何處理定義中的嵌入空格。 您在字符串變量中放置單引號是正確的,但請記住,解析器將變量替換為變量中定義的確切內容。
您的最終結果腳本文件名在文件名的兩側都有兩個單引號。 IE
"DATABASEFILENAME = '$DATABASEFILENAME'"
放置在腳本中會在替換發生后導致以下結果
FILENAME = N''C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008INSTANCE\MSSQL\DATA\myDB.mdf''
要修復您發布的內容:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.