2012-01-06 45 views
12

Tôi có kịch bản lệnh dưới đây tạo bảng và chèn một số dữ liệu rồi tạo các thủ tục được lưu trữ.Cách lấy đường dẫn tương đối của tệp trong Chế độ SQLCMD trong SSMS?

--todo_master.sql 

use master 
go 

:r todo_create_ddl.sql 
:r todo_create_dml.sql 
:r todo_create_sprocs.sql 
go 

Tuy nhiên, mặc dù todo_master.sql có cùng đường dẫn với ba tập lệnh khác, nhưng không thể định vị ba tập lệnh đó.

tôi nhận được lỗi sau:

A fatal scripting error occurred. 
The file specified for :r command was not found. 

Nếu tôi cung cấp đường dẫn đầy đủ như dưới đây, những tập tin này được tìm thấy và được thực hiện như dự định.

"C:\Docs and Settings\user\My Docs\SSMS\Projects\todo_create_ddl.sql"

Tôi có thể thiếu gì?


Sửa Theo đề nghị của Jason Tôi cố gắng này, nhưng vẫn nhận được lỗi tương tự:

use master 
go 

:setvar path "C:\Documents and Settings\user\My Documents\SQL Server Management Studio\Projects" 
:setvar ddl "todo_create_ddl.sql" 
:setvar dml "todo_create_dml.sql" 
:setvar sprocs "todo_create_sprocs.sql" 

:r $(path)$(ddl) 
:r $(path)$(dml) 
:r $(path)$(sprocs) 
go 
+2

Một liên quan [vấn đề] (https://connect.microsoft.com/VisualStudio/feedback/details/667994/sqlcmd-execute-r-không được hỗ trợ-chính xác) trong connect.microsoft.com – Animesh

Trả lời

21

Bạn có thể làm việc này bằng cách sử dụng sqlcmd setvar tùy chọn để gán đường dẫn đến một biến. Sau đó, sử dụng biến đó trong cuộc gọi :r của bạn như:

:setvar path "c:\some path" 
:r $(path)\myfile.sql 

Liên kết này có một sâu hơn ví dụ: http://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/

Với ý nơi bạn có thể loại bỏ các dòng setvar và thông qua đó từ dòng lệnh với:

Sqlcmd /Sserver /E -ddatabase -iInputfilename -oOutputfilename -v path=c:\somepath 

Điều này sẽ giải quyết được vấn đề của tập lệnh không chạy từ thư mục mà tập lệnh SQL đầu tiên được gọi.

+0

Cảm ơn bạn đã đề xuất. Thật không may điều này đã không làm việc cho tôi. Tôi đã cập nhật câu hỏi để bao gồm những gì tôi đã thử dựa trên đề xuất của bạn. – Animesh

+0

Thử đặt dấu gạch chéo ngược giữa các biến.: r $ (đường dẫn) \ $ (ddl) –

+0

Tôi đã thử đặt dấu gạch chéo ngược ở giữa, vẫn không hoạt động – Animesh

3

tôi đã tìm thấy, rằng đây sẽ là tốt nhất:

:setvar path C:\"some path" 

:r $(path)\myfile.sql 

Bạn phải đặt câu với một không gian trong dấu ngoặc kép, nhưng không phải là toàn bộ câu lệnh. Đó là lý do tại sao bạn có thể làm C:\"some path"

5

Tôi nhận thấy điều này khá cũ, nhưng tôi nhận thấy có lỗi trong mã Đã chỉnh sửa của bạn: bạn cần bao gồm dấu gạch chéo ngược giữa đường dẫn và tên tập lệnh.

:r $(path)\$(ddl) 
:r $(path)\$(dml) 
:r $(path)\$(sprocs) 
3

Nhận đường dẫn tương đối trong SSMS không thẳng về phía trước vì bạn không thực thi tập lệnh; SSMS đã tải tập lệnh vào bộ nhớ và đang thực thi văn bản của nó. Vì vậy thư mục/thư mục hiện tại là thư mục khởi động mặc định. Bạn có thể thấy điều này bằng cách chạy các chế độ sau trong chế độ SQLCMD trong SSMS:

!! PWD 

Tuy nhiên, tôi đã tìm được cách để thực hiện việc này. Tôi thừa nhận rằng đây không phải là cách lý tưởng nhất để làm điều này, tuy nhiên, hiện tại dường như là cách duy nhất để có được đường dẫn tương đối đúng (cho rằng cài đặt đường dẫn trong biến không thực sự "tương đối" mỗi gia nhập).

Vì vậy, những gì bạn có thể làm là:

  1. Thực hiện một lệnh DOS để tìm todo_master.sql và lưu trữ đường dẫn đến tập tin trong một file văn bản trong một thư mục mà bạn có thể nhận được từ SSMS, hoặc vì nó là một đường dẫn mã hóa cứng hoặc vì nó sử dụng một biến môi trường có sẵn cho cả lệnh DOS và chế độ SQLCMD trong SSMS
  2. Khi lưu trữ đường dẫn trong tệp đó, hãy lưu nó dưới dạng lệnh chế độ SQLCMD đặt biến thành đường dẫn đó
  3. Nhập tệp văn bản đó vào SSMS bằng cách sử dụng :r và nó sẽ thiết lập biến mà để con đường mong muốn
!! CD C:\ & FOR /F %B IN ('DIR /B /A -HS /S todo_master.sql') DO ECHO :setvar mypath "%~dpB" > %TEMP%\relative_path.txt 

:r $(TEMP)\relative_path.txt 

:r $(mypath)\todo_create_ddl.sql 
GO 
:r $(mypath)\todo_create_dml.sql 
GO 
:r $(mypath)\todo_create_sprocs.sql 
GO 

Ghi chú:

  • Các phương pháp trên giả định chỉ có 1 tập tin trên hệ thống được đặt tên todo_master.sql. Nếu có nhiều hơn một tập tin có tên đó, cuối cùng một tìm thấy sẽ là con đường thiết lập trong relative_path.txt tập tin

  • Làm CD C:\ sẽ bắt đầu từ thư mục gốc của C: ổ đĩa. Đây có lẽ không phải là nơi hiệu quả nhất để bắt đầu. Nếu bạn thường có file SQL của bạn trong một khu vực như C: \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects, sau đó chỉ cần thay đổi lệnh CD để có được gần gũi hơn với các điểm đến, chẳng hạn như:

    !! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ... 
    
+0

Cảm ơn giải pháp của bạn, một tinh chỉnh nhỏ là nếu đường dẫn của bạn chứa không gian, bạn cần phải bao gồm tùy chọn ** delims ** cho lệnh ** FOR **. Ví dụ: 'FOR" delims =; " % B IN (... ' –

0

Tôi cũng có cùng vấn đề này - tại sao không mở một ví dụ Dos/Cmd hoặc PowerShell, cd vào thư mục chứa tập lệnh, sau đó tải Management Studio từ đó?

Tôi có bí danh này trong PowerShell tôi thiết lập (đường dẫn của bạn có thể khác):

Set-Alias -Name 'Ssms' -Value "${env:ProgramFiles(x86)}\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\Ssms.exe" 

Sau đó tôi cd đến thư mục chứa các tập tin giải pháp, sau đó tôi làm

Ssms mysolution.ssmssln 
0

Sử dụng một batchfile như một người trợ giúp.

Sửa todo_master.sql sử dụng một biến môi trường được gọi là mypath:

use master 
go 
:r $(mypath)\todo_create_ddl.sql 
:r $(mypath)\todo_create_dml.sql 
:r $(mypath)\todo_create_sprocs.sql 
go 

Và trong tập tin batch todo_master.bat

/* set the environment variable to the current directory */ 
SET mypath=%cd% 
/* run your sql command */ 
sqlcmd -i todo_master.sql