如何使用Invoke-Sqlcmd连接到SQL Server LocalDB?

时间:2013-06-13 08:42:53

标签: powershell sql-server-2012 localdb sqlps

我从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

4 个答案:

答案 0 :(得分:0)

从其他几个来源得到这个,似乎到目前为止工作。

JBs Powershell

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实例上数据库的名称。