我从SQLServer 2008和SQLServer 2012获得sqlcmd.exe
:
PS C:\> Get-Command sqlcmd.exe
Definition
----------
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE
通过修改$env:PATH
我强制使用SQL Server 2012中的sqlcmd.exe
:
PS C:\> $env:PATH = ($env:PATH -split ";" | Where-Object { $_ -notlike "*\Microsoft SQL Server\100\*" }) -join ";"
PS C:\> Get-Command sqlcmd.exe
Definition
----------
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE
LocalDB的默认实例已启动并正在运行,并由当前用户拥有:
PS C:\> sqllocaldb i v11.0
Name: v11.0
Version: 11.0.2318.0
Shared name:
Owner: DOMAIN\me
Auto-create: Yes
State: Running
Last start time: 12/06/13 18:17:57
Instance pipe name: np:\\.\pipe\LOCALDB#08EDBEF0\tsql\query
现在,我可以使用(localdb)\v11.0
sqlcmd.exe
上执行命令
PS C:\> sqlcmd.exe -S "(localdb)\v11.0" -Q "select 1"
-----------
1
但在使用Invoke-Sqlcmd
尝试相同时,我收到连接错误:
PS C:\> Import-Module sqlps
PS C:\> Invoke-Sqlcmd -ServerInstance "(localdb)\v11.0" -Query "select 1"
Invoke-Sqlcmd : A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)
我可以做些什么来Invoke-Sqlcmd
连接到(localdb)\v11.0
?
答案 0 :(得分:0)
从其他几个来源得到这个,似乎到目前为止工作。
和
How can I run PowerShell with the .NET 4 runtime?
使PowerShell和LocalDB发挥出色的另一种方法是让PowerShell了解DOTNET 4.0.3。这可以通过在C:\ Windows \ System32 \ WindowsPowerShell \ v1.0中创建名为“powershell.exe.config”的文件来完成。该文件应包含以下内容:
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
请注意,这不是官方支持的使用PowerShell的方式,因此可能会破坏其他内容......
答案 1 :(得分:0)
这是在恶劣条件下适合我的代码(请参阅代码后面的我的评论)。我怀疑更简单的代码可能在更常见的环境中工作,但我没有深入研究它。
实例管道在几分钟后超时。如果你可以使用(localdb)\ instanceName 进行连接,你会更好,因为这些连接似乎没有超时。
function Get-InstancePipeName ([string] $localDbName)
{
while (!($pipeName = ((sqllocaldb info $localDbName) -match 'instance pipe name').Split(':', 2)[1].Trim()))
{
sqllocaldb start $localDbName | Out-Null
}
return $pipeName
}
$scsb = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
$scsb.psbase.DataSource = Get-InstancePipeName localDbName # <== put your db name here
$sc = New-Object System.Data.SqlClient.SqlConnection $scsb.ConnectionString
$smoSc = New-Object Microsoft.SqlServer.Management.Common.ServerConnection $sc
$smoSvr = New-Object Microsoft.SqlServer.Management.Smo.Server $smoSc
Invoke-Sqlcmd -ServerInstance $smoSvr -Query 'select 1'
由于目前无法控制的原因,运行的执行环境不常见。它是一个具有不完整会话上下文的远程执行环境。此外,我不得不重新定义USERPROFILE以解决其他一些问题。
[后来编辑:我最近发现a way to extend the timeout - 我必须在第二个sp_configure之后添加一个RECONFIGURE并且(按照建议)停止并启动localdb以使其生效)]
答案 2 :(得分:-1)
我猜测invoke-sqlcmd不知道“(localdb)”是什么。请尝试使用localhost。
答案 3 :(得分:-1)
我最近在工作中这样做,并且在连接到本地数据库时遇到了一些初步问题。为了让它工作,我运行了以下代码;
C:\> Import-Module sqlps -DisableNameChecking
SQLSERVER\:> cd ".\SQL\$(hostname)"
SQLSERVER\:> Invoke-Sqlcmd -Username "user" -Password "pass" -Database "databasename" -Query "foobar"
这对我有用,我能够查询数据库。显然,将用户名,密码和数据库参数详细信息更改为调用SQL实例上数据库的名称。