2013-06-13 30 views
8

Tôi có sqlcmd.exe từ cả hai SQLServer 2008 và SQLServer 2012:Làm thế nào để kết nối với SQL Server LocalDB bằng cách sử dụng Invoke-Sqlcmd?

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 

Bằng cách thay đổi $env:PATH tôi buộc việc sử dụng sqlcmd.exe từ SQL 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 

Các trường hợp mặc định của LocalDB được lên và chạy và được sở hữu bởi người dùng hiện tại:

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 

Bây giờ, tôi có thể execu te lệnh trên (localdb)\v11.0 sử dụng sqlcmd.exe

PS C:\> sqlcmd.exe -S "(localdb)\v11.0" -Q "select 1" 

----------- 
      1 

Nhưng khi cố gắng cùng với Invoke-Sqlcmd tôi nhận được một lỗi kết nối:

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) 

gì tôi có thể làm gì để lmake Invoke-Sqlcmd kết nối với (localdb)\v11.0?

+0

Điều thú vị là đủ, nó hoạt động từ PowerGUI và không thành công từ PowerShell. Tôi đã theo dõi cả hai quy trình với ProcessMonitor và cả hai nạp đúng mô-đun (C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ PowerShell \ Modules \ SQLPS \ SQLPS.PSD1). Cả hai đều có thể kết nối với một cá thể "thông thường", chẳng hạn như SQLEXPRESS. – spaghettidba

Trả lời

-1

Tôi đoán rằng invoke-sqlcmd không biết "(localdb)" là gì. Hãy thử sử dụng localhost thay thế.

+0

không hoạt động đối với tôi. Phải là cái gì đó khác, nhưng không biết gì. – spaghettidba

+0

Không làm việc cho tôi quá: ( –

+1

Nó sẽ xuất hiện mà invoke-sqlcmd không hỗ trợ localdb.Bạn phải hiểu rằng gọi-sqlcmd không chỉ gọi sqlcmd và đi qua trong các tham số.Nó là phiên bản riêng của sqlcmd và nó không hoàn toàn hỗ trợ tất cả mọi thứ mà sqlcmd làm, ít nhất là chưa 1. –

0

Nhận điều này từ một vài nguồn khác, có vẻ như hoạt động cho đến nay.

JBs Powershell

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

Một cách khác để làm cho PowerShell và LocalDB chơi đẹp là làm cho PowerShell biết DotNet 4.0.3. Điều này có thể được thực hiện bằng cách tạo ra một tập tin gọi là "powershell.exe.config" trong C: \ Windows \ System32 \ WindowsPowerShell \ v1.0. Các tập tin nên chứa những điều sau đây:

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

Hãy nhận biết rằng đây không phải là một cách hỗ trợ chính thức của việc sử dụng PowerShell, vì vậy nó có thể phá vỡ những thứ khác ...

0

Tôi đã làm điều này tại nơi làm việc thời gian gần đây và có một số rắc rối ban đầu kết nối với cơ sở dữ liệu cục bộ. Để làm cho nó hoạt động, tôi chạy đoạn mã sau;

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

Điều này làm việc cho tôi và tôi có thể truy vấn cơ sở dữ liệu. Rõ ràng, thay đổi thông tin chi tiết về tên người dùng, mật khẩu và cơ sở dữ liệu cho bất kỳ tên cơ sở dữ liệu nào của bạn trên SQL Instance được gọi.

+0

FWIW, đây là một cơ sở dữ liệu cục bộ chứ không phải 'localdb' (tức là: một là cài đặt sql đầy đủ và cái còn lại là , well, localdb). –

0

Đây là mã hoạt động cho tôi trong các điều kiện bất lợi (xem nhận xét của tôi ngay sau mã). Tôi nghi ngờ rằng mã đơn giản hơn có thể làm việc trong một môi trường phổ biến hơn, nhưng tôi chưa đào sâu vào nó.

Đường ống mẫu xuất hiện sau một vài phút. Bạn nên tắt nếu bạn có thể kết nối bằng cách sử dụng (localdb) \ instanceName, vì các kết nối đó dường như không hết thời gian chờ.

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' 

Vì lý do ngoài tầm kiểm soát của tôi, môi trường thực thi nơi điều này không bình thường.Đó là một môi trường thực thi từ xa với ngữ cảnh phiên không đầy đủ. Ngoài ra, tôi đã phải xác định lại USERPROFILE để làm việc xung quanh một số vấn đề khác.

[sau chỉnh sửa: Gần đây tôi đã tìm thấy a way to extend the timeout - Tôi đã có thêm một cấu hình lại sau khi sp_configure 2 và (theo khuyến cáo) dừng lại và bắt đầu localdb để làm cho nó có hiệu lực)]