How to connect to SQL Server LocalDB using Invoke-Sqlcmd?

后端 未结 4 2036
猫巷女王i
猫巷女王i 2021-02-20 11:39

I have sqlcmd.exe from both SQLServer 2008 and SQLServer 2012:

PS C:\\> Get-Command sqlcmd.exe

Definition
----------
C:\\Program Files\\Microsof         


        
相关标签:
4条回答
  • 2021-02-20 11:54

    I have been doing this at work recently and had some initial troubles connecting to a local Database. To get it to work, I ran the following code;

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

    This worked for me and I was able to query the database. Obviously, change the Username, Password and Database parameter details to whatever the name of your database on the SQL Instance is called.

    0 讨论(0)
  • 2021-02-20 11:58

    This is code that works for me under adverse conditions (see my comments just after the code). I suspect that simpler code may work in a more common environment, but I haven't dug into it.

    The instance pipe times out after a few minutes. You're better off if you can connect using (localdb)\instanceName, because those connections don't seem to time out.

    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'
    

    For reasons currently outside my control, the execution environment where this runs is unusual. It's a remote execution environment with an incomplete session context. Also, I had to redefine USERPROFILE to work around some other issues.

    [later edit: I recently found a way to extend the timeout - I had to add a RECONFIGURE after the 2nd sp_configure and (as recommended) stop and start the localdb to get it to take effect)]

    0 讨论(0)
  • 2021-02-20 12:00

    Got this from a couple other sources, seems to work so far.

    JBs Powershell

    and

    How can I run PowerShell with the .NET 4 runtime?

    Another way of making PowerShell and LocalDB play nice is to make PowerShell aware of DOTNET 4.0.3. This can be done by creating a file called "powershell.exe.config" in the C:\Windows\System32\WindowsPowerShell\v1.0 . The file should contain the following:

    <?xml version="1.0"?>
    <configuration> 
         <startup useLegacyV2RuntimeActivationPolicy="true"> 
              <supportedRuntime version="v4.0.30319"/> 
              <supportedRuntime version="v2.0.50727"/> 
         </startup> 
    </configuration>
    

    Be aware that this not an officially supported way of using PowerShell, so it might break other stuff ...

    0 讨论(0)
  • 2021-02-20 12:07

    I'm guessing that invoke-sqlcmd doesn't know what "(localdb)" is. Try using localhost instead.

    0 讨论(0)
提交回复
热议问题