簡體   English   中英

Invoke-Sqlcmd、InputFile 和變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM