2009-05-07 42 views
16

Khi chạy SQLCMD.exe và cung cấp đối số dòng lệnh cho biến tập lệnh, tôi hy vọng rằng giá trị được cung cấp trên dòng lệnh sẽ ghi đè những giá trị được xác định trong tệp tập lệnh SQL.SQLCMD, biến dòng lệnh và tập lệnh: setvar

ví dụ:

Với Script SQL sau:

:setvar XXX "SQL script" 
print '$(XXX)' 

Và dòng lệnh:

sqlcmd.exe -S <Server> -d <Database> -E -b -i <Script> -v XXX="Batch script" 

Tôi hy vọng sản lượng là:

hàng loạt kịch bản

Tuy nhiên sản lượng là:

SQL script

Đây có phải là ý định, hoặc phải các :setvar báo cáo trong kịch bản SQL được gỡ bỏ?

Tôi đã cung cấp câu lệnh :setvar trong tập lệnh, vì vậy tôi có thể chỉnh sửa/kiểm tra tập lệnh trong SQL Management Studio bằng chế độ SQLCMD, nhưng chạy tập lệnh từ dòng lệnh trong môi trường thử nghiệm và sản xuất của mình.

Trả lời

17

Điều này dường như theo thiết kế; ai đó đã nêu ra một yêu cầu thay đổi trên Connect: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=382007

Cách duy nhất xung quanh vấn đề này tôi có thể thấy sẽ được nhận xét ra (hoặc loại bỏ) các :setvar lệnh về phát hành.

+5

Điều đó thật tuyệt! Cảm ơn – VirtualStaticVoid

+4

Điều đó thực sự sucks! Tôi nhận thấy rằng đề xuất về Microsoft Connect đã được mở trong năm 2008 và nó vẫn hoạt động. Vâng, tôi đã bình chọn cho nó anyway, mặc dù hy vọng của tôi không phải là rất cao. –

+0

http://www.codeproject.com/Articles/1019661/Powershell-Scripts-to-Replace-setvar-Variable-in-S – Kody

1

tôi nghĩ rằng đó là cố ý. hiện tại câu lệnh setvar trong tập lệnh .sql có mức ưu tiên cao nhất.

7

Tôi đã đấu tranh với điều này là tốt, nhưng tôi nhớ đã nhận thấy msdeploy.exe cũng có thể thực thi các kịch bản sql với các biến. Tuy nhiên, vì một số lý do kỳ lạ, msdeploy.exe có thể truyền các biến từ dòng lệnh với các giá trị biến từ dòng lệnh có quyền ưu tiên hơn các giá trị được xác định trong chính kịch bản lệnh đó.

Một ví dụ: Tôi có một kịch bản sql (NavDbSecurity.sql) trong đó có ba thông số định nghĩa:

:setvar loginName "testLoginName" 
:setvar databaseName "testDatabaseName" 
:setvar NavCompanyName "blablabla" 

Khi tôi thực thi kịch bản msdeploy sau, các giá trị thông số tôi đi qua các dòng lệnh được ưu tiên hơn các giá trị được định nghĩa trong tập tin kịch bản (không nhớ người dùng sa mà không cần mật khẩu;)):

msdeploy.exe -verb:sync -source:dbfullsql="c:\NavDbSecurity.sql" -dest:dbfullsql="data source=.\sqlexpress;initial catalog=data base;User Id=sa;Password=;",transacted=False -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=databaseName,value="[data base]" -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=loginName,value="domain\user" -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=NavCompanyName,value="testCompany" 
3

Xem xét sử dụng lệnh :r filename cho setvars của bạn.

Là một tệp riêng biệt, bạn có thể sử dụng cùng một phạm vi cho mỗi vùng triển khai của bạn, mỗi vùng chứa nội dung cụ thể theo vùng của riêng họ.

:r path\sqlConfig.sql 
4

Thử chỉnh sửa tập tin sqlproj của bạn và thêm các tài sản sau đây

<CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations> 

File sql tạo ra sẽ có các setvars nhận xét ra và sau đó bạn có thể sử dụng dòng lệnh để thiết lập giá trị thực tế.

+0

Điều này thực sự hữu ích, Trong bản dựng CI của tôi, tôi đã thêm '/ p: CommentOutSetVarDeclarations = True' cho lệnh msbuild và từ đó vấn đề ưu tiên không còn là vấn đề nữa. –

Các vấn đề liên quan