10

sqlcmd.exe来自 SQLServer 2008 和 SQLServer 2012:

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:PATHi 强制使用sqlcmd.exeSQL Server 2012:

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连接到lmake (localdb)\v11.0

4

8 回答 8

0

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

JBs Powershell

如何使用 .NET 4 运行时运行 PowerShell?

另一种让 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 的方式,因此它可能会破坏其他东西......

于 2013-10-04T20:58:40.907 回答
0

据我所知sqlcmd.exe,使用一个包含所有信息的连接字符串,而Invoke-Sqlcmd将这些信息分解为不同的参数。因此,您可能需要拆分(localdb)v11.0跨越ServerInstanceDatabaseComputerName。或者,您可以改用该ConnectionString参数。

现在,我不熟悉你的使用,localdb所以它处理它的方式可能有些时髦......或其他东西。

于 2022-01-13T06:56:25.933 回答
0

更新

Invoke-SqlcmdSqlServer模块支持LocalDB:

Invoke-Sqlcmd -ServerInstance "(localdb)\v11.0" -Query "select 1"
Invoke-Sqlcmd -ConnectionString "Server=(localdb)\v11.0; Integrated Security=True" -Query "select 1"

# both will work
于 2021-11-30T16:56:37.000 回答
-1

我最近在工作中一直在这样做,并且在连接到本地数据库时遇到了一些初始问题。为了让它工作,我运行了以下代码;

C:\> Import-Module sqlps -DisableNameChecking
SQLSERVER\:> cd ".\SQL\$(hostname)"
SQLSERVER\:> Invoke-Sqlcmd -Username "user" -Password "pass" -Database "databasename" -Query "foobar"

这对我有用,我能够查询数据库。显然,将用户名、密码和数据库参数详细信息更改为 SQL 实例上调用的数据库名称。

于 2015-09-12T13:29:56.157 回答
-1

这是在不利条件下对我有用的代码(请参阅我在代码后面的评论)。我怀疑更简单的代码可能在更常见的环境中工作,但我还没有深入研究它。

实例管道在几分钟后超时。如果您可以使用 (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 来解决其他一些问题。

[稍后编辑:我最近找到了一种延长超时的方法- 我必须在第二个 sp_configure 之后添加一个 RECONFIGURE 并(按照建议)停止并启动 localdb 以使其生效)]

于 2016-12-27T22:10:14.037 回答
-1

您是否安装了 SQL 模块?

  • 以管理员身份运行 powershell.exe
  • 请务必正确设置 TLS
  • [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
  • 然后 Install-Module,你的模块 PSM1 文件

然而,这是我使用的,我从不在新的 shell 会话中导入模块。这完美无缺,我可以通过传递自定义查询的循环来调用它。如果要写入多个实例/数据库,则使用参数并删除函数中的硬编码变量。

function Execute-SQL($dataSource, $database, $query, [switch]$read, [switch]$write){
$dataSource                  = "YOUR INSTANCE"
$database                    = "YOUR DATABASE NAME"
$connectionString            = "Server = $dataSource; Database = $database; Integrated Security = $TRUE;"
$connection                  = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
$cmd                         = New-Object System.Data.SqlClient.SqlCommand
$cmd.Connection              = $connection
$cmd.CommandText             = $query
$cmd.CommandTimeout          = 0
if($write){
    try{
        $cmd.ExecuteNonQuery() | Out-Null
    }catch{
        #Write-Host $Error[0] -ForegroundColor DarkRed
        #Write-Host $cmd.CommandText -ForegroundColor DarkGray
    }
}elseif($read){
    try{
        $output                = ""
        $adapter               = New-Object System.Data.SqlClient.SqlDataAdapter
        $adapter.SelectCommand = $cmd
        $DataSet               = New-Object System.Data.DataSet
        $adapter.Fill($DataSet) | Out-Null
        $output                = $DataSet.Tables[0] | ?{$_}
        $connection.Close()
        return $output
    }catch{
        #Write-Host $Error[0] -ForegroundColor DarkRed
        #Write-Host $query -ForegroundColor DarkCyan
    }
}else{
    #Write-Host "READ/WRITE NOT SPECIFIED" -ForegroundColor DarkCyan
}
$connection.Close()

}

于 2021-09-29T13:33:46.417 回答
-1

这是我使用的,我每天都使用 PowerShell 来利用 SQL。创建一个您根据需要调用的函数。在别处构建您的查询并将它们传递给此函数。请务必使用 -read 或 -write 开关,以便它使用正确的调用。读取返回一个值,写入仅执行。默认情况下,我已将错误消息注释掉,但如果某些东西不起作用,请启用它们。

就数据库连接而言,安装 SSMS 并验证其设置是否正确。如果您可以在 SSMS 中查询它,那么此功能将起作用。如果其他帐户对此实例具有提升的权限,则以该用户身份运行 PS。

我强烈建议使用 ISE 而不是标准 shell。

function Execute-SQL($query, [switch]$read, [switch]$write){
    $dataSource                  = "Your instance name"
    $database                    = "Your database name"
    $connectionString            = "Server = $dataSource; Database = $database; Integrated Security = $TRUE;"
    $connection                  = New-Object System.Data.SqlClient.SqlConnection
    $connection.ConnectionString = $connectionString
    $connection.Open()
    $cmd                         = New-Object System.Data.SqlClient.SqlCommand
    $cmd.Connection              = $connection
    $cmd.CommandText             = $query
    $cmd.CommandTimeout          = 0
    if($write){
        try{
            $cmd.ExecuteNonQuery() | Out-Null
        }catch{
            #Write-Host $Error[0] -ForegroundColor DarkRed
            #Write-Host $cmd.CommandText -ForegroundColor DarkGray
        }
    }elseif($read){
        try{
            $output                = ""
            $adapter               = New-Object System.Data.SqlClient.SqlDataAdapter
            $adapter.SelectCommand = $cmd
            $DataSet               = New-Object System.Data.DataSet
            $adapter.Fill($DataSet) | Out-Null
            $output                = $DataSet.Tables[0] | ?{$_}
            $connection.Close()
            return $output
        }catch{
            #Write-Host $Error[0] -ForegroundColor DarkRed
            #Write-Host $query -ForegroundColor DarkCyan
        }
    }else{
        #Write-Host "READ/WRITE NOT SPECIFIED" -ForegroundColor DarkCyan
    }
    $connection.Close()
}
于 2021-08-19T17:11:25.817 回答
-2

我猜invoke-sqlcmd 不知道“(localdb)”是什么。尝试使用 localhost 代替。

于 2013-06-13T09:49:54.440 回答