首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用-Sqlcmd、InputFile和变量

调用-Sqlcmd、InputFile和变量
EN

Stack Overflow用户
提问于 2013-05-20 17:25:34
回答 3查看 15.1K关注 0票数 12

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

Init.ps1

代码语言:javascript
复制
$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

代码语言:javascript
复制
 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脚本

代码语言:javascript
复制
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。所以问题就在这里。现在,我得到了以下错误:创建数据库错误:数据库错误:对象或列名丢失或为空。对于SELECT INTO语句,验证每个列都有一个名称。对于其他语句,请查找空别名。定义为"“或[]的别名是不允许的。将别名更改为有效名称。标签'C‘已经声明了。标签名称在查询批处理或存储的procedure..Exception.Exception中必须是唯一的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-20 19:21:03

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

代码语言:javascript
复制
$sqlVariable = "DATABASEFILENAME='$DATABASEFILENAME'", "DATABASELOGNAME='$DATABASELOGNAME'", "DBUSEROWNER='$DBUSEROWNER'"

此外,还需要从变量中删除单引号:

代码语言:javascript
复制
$sqlVariable = "DATABASEFILENAME=$DATABASEFILENAME", "DATABASELOGNAME=$DATABASELOGNAME", "DBUSEROWNER=$DBUSEROWNER"
票数 12
EN

Stack Overflow用户

发布于 2013-05-20 18:45:26

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

此外,没有必要定义日志和数据文件的位置,尝试使用下面的片段,它对我在许多项目中有效。

代码语言:javascript
复制
$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
票数 0
EN

Stack Overflow用户

发布于 2022-08-23 15:19:41

我知道这是旧的,没有任何真正好的解释/例子,所以我张贴这个答案。

在命令变量替换之后,TSQL脚本在数据文件名和日志文件名的值周围有两个单引号,由此生成错误。这是由于包含单引号的变量值,以及包含在单引号中的变量的TSQL脚本用法。命令变量没有那么挑剔,解析器不知道如何处理定义中的嵌入式空间。在字符串变量中放置单引号是正确的,但是请记住,解析器将变量替换为变量中所定义的内容。

最终结果脚本文件名在文件名的两边都有两个单引号。即

"DATABASEFILENAME = '$DATABASEFILENAME'"

放置在脚本中将导致在替换发生后发生以下情况

代码语言:javascript
复制
FILENAME = N''C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008INSTANCE\MSSQL\DATA\myDB.mdf''

要修复您发布的内容:

SQL脚本

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16654866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档