【问题标题】:Invoke-Sqlcmd, InputFile, and VariableInvoke-Sqlcmd、InputFile 和变量
【发布时间】:2013-05-15 07:50:24
【问题描述】:

我需要执行一个 powershell 脚本,该脚本执行一个 SQL 脚本来创建数据库。 根据我的知识,我以这种方式执行 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

我按照@Chad Miller 的建议更新了 $sqlVariable。 所以问题就在那里。 现在我得到了这个错误:创建数据库错误:数据库错误:对象或列名丢失或为空。对于 SELECT INTO 语句,验证每一列都有一个名称。对于其他语句,请查找空别名。不允许使用定义为 "" 或 [] 的别名。将别名更改为有效名称。 标签“C”已被声明。标签名称在查询批处理或存储过程中必须是唯一的..Exception.Exception

【问题讨论】:

  • 定义“不起作用”。您得到的结果与您期望的结果有何不同?
  • 你能添加一些硬编码的值吗? "DATABASEFILENAME = MyFileName"、"DATABASELOGNAME = 'sa'"、"DBUSEROWNER = 'myUser'" 作为临时测试?
  • 我更新了问题
  • @granadaCoder 是的,我可以,我会这样做
  • 试着去掉空格。 IIRC,我使用了 MYVARIABLENAME=Abc123 (没有空格)。

标签: sql-server powershell


【解决方案1】:

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

$sqlVariable = "DATABASEFILENAME='$DATABASEFILENAME'", "DATABASELOGNAME='$DATABASELOGNAME'", "DBUSEROWNER='$DBUSEROWNER'"

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

$sqlVariable = "DATABASEFILENAME=$DATABASEFILENAME", "DATABASELOGNAME=$DATABASELOGNAME", "DBUSEROWNER=$DBUSEROWNER"

【讨论】:

  • 你是对的,但现在我收到以下错误创建数据库错误:数据库错误:对象或列名丢失或为空。对于 SELECT INTO 语句,验证每一列都有一个名称。对于其他语句,请查找空别名。不允许使用定义为 "" 或 [] 的别名。将别名更改为有效名称。标签“C”已被声明。标签名称在查询批处理或存储过程中必须是唯一的..Exception.Exception
  • MDSN's document中,给出的例子有单引号和空格,这是为什么呢? $MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'" Invoke-Sqlcmd -Query "SELECT $(MyVar1) AS Var1, $(MyVar2) AS Var2;" -Variable $MyArray
  • 如果您将其与 azdevops 变量混合使用,请不要在变量名称中包含句点,如下所示:$(Category.Thing.Name)。它不会解析。
【解决方案2】:

首先,指定错误消息(如果有)。

另外,不需要定义日志和数据文件的位置,尝试使用下面的sn-p,它在很多项目中都适用于我。

$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

【讨论】:

  • 虽然不是必需的,但最好将数据库文件与日志文件分开。
猜你喜欢
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
相关资源
最近更新 更多