2015-04-20 17 views
6

Tôi đang sử dụng SSDT (và sqlproj) cho các dự án MSSQL của chúng tôi. Chúng tôi có một vài biến mà chúng tôi cần phải đặt khi xuất bản cho từng môi trường. Điều này hoạt động tốt trên hầu hết các môi trường của chúng tôi, nơi chúng tôi gán giá trị cho tất cả các biến, nhưng khi chúng tôi xuất bản lên cơ sở dữ liệu trực tiếp của chúng tôi, tôi muốn có thể làm cho DomainPrefix trở thành một chuỗi trống.Cách tạo SSDT Profile.xml SqlCmdVariable một chuỗi rỗng hoặc tùy chọn

Khi tôi cố gắng thay đổi tệp Live.profile.xml để đặt DomainPrefix thành không có giá trị, tôi nhận được lỗi: "Đã xảy ra lỗi trong quá trình tạo kế hoạch triển khai. Không thể tiếp tục. Thiếu giá trị cho các biến SqlCmd sau: DomainPrefix. "

Đây là những gì tôi muốn các Live.profile.xml để trông giống như:

<?xml version="1.0" encoding="UTF-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0"> 
    <PropertyGroup> 
    <TargetDatabaseName>DB_NAME</TargetDatabaseName> 
    <DeployScriptFileName>DB_NAME.sql</DeployScriptFileName> 
    <TargetConnectionString>CONNECTION_STRING</TargetConnectionString> 
    <ProfileVersionNumber>1</ProfileVersionNumber> 
    </PropertyGroup> 
    <ItemGroup> 
    <SqlCmdVariable Include="DomainPrefix"> 
     <Value></Value> 
    </SqlCmdVariable> 
    <SqlCmdVariable Include="Environment"> 
     <Value>live</Value> 
    </SqlCmdVariable> 
    </ItemGroup> 
</Project> 

Có ai biết làm thế nào để thiết lập một SqlCmdVariable đến một giá trị trống hoặc làm cho nó một biến không bắt buộc?

Sử dụng:

  • VS 2013 sqlproj
  • SqlPackage.exe để chạy các xuất bản vào DB từ dòng lệnh
+0

Bạn đang sử dụng DomainPrefix như thế nào? Đó có phải là một phần của tập lệnh Pre/Post, được sử dụng trong các đối tượng/mã, tên máy chủ, cái gì khác không?Nếu bạn chỉ sử dụng nó cho các tập lệnh Pre/Post, bạn có thể thao tác các tập lệnh đó tương ứng với một phần cho Sản xuất hơi khác một chút. –

+0

DomainPrefix cụ thể đang được sử dụng trong một kịch bản bài đăng và chúng tôi có một số mã để xử lý nó - nhưng cũng là một trong số một số biến mà chúng tôi muốn đặt làm chuỗi trống, vì vậy sẽ rất hữu ích nếu bạn biết cách tạo nó trống/tùy chọn. – Saan

+0

Tôi không biết cách nào để làm điều đó, đó là lý do tại sao tôi muốn chắc chắn rằng bạn chỉ sử dụng nó trong một kịch bản Post. Bạn có thể kiểm tra một số giá trị (ví dụ: "Prod") và để trống nếu trường hợp đó xảy ra và/hoặc tạo một phần cho Sản xuất. Tôi nghĩ rằng làm cho MS không bao giờ xem xét một biến trống vì điều đó có thể gây ra sự tàn phá nếu được sử dụng trong mã, đặc biệt là cho các tên DB. –

Trả lời

2

Dường như không có cách nào để đi qua một NullOrWhiteSpace chuỗi dưới dạng SqlCmdVariable. Cú pháp cơ bản cho SqlCmdVariable là:

<SqlCmdVariable Include="DomainPrefix"> 
    <DefaultValue> 
    </DefaultValue> 
    <Value></Value> 
</SqlCmdVariable> 

Hoặc Value hay DefaultValue nhu cầu phải có một số giá trị không gian không phải da trắng. Vì vậy, đối với tùy chọn đầu tiên của bạn, như @Peter đề xuất trong một nhận xét về câu hỏi, bạn có thể xử lý điều này trong kịch bản SQL triển khai bài của bạn bằng cách thử nghiệm một giá trị cụ thể, chẳng hạn như <Live> hoặc bất kỳ điều gì. Làm điều gì đó như sau:

DECLARE @DomainPrefix NVARCHAR(50) = N'$(DomainPrefix)'; 

IF (@DomainPrefix = N'<Live>') 
BEGIN 
    SET @DomainPrefix = ''; 
END; 

Và sau đó chỉ cần nối @DomainPrefix vào chuỗi thay vì bao gồm $(DomainPrefix) trong đó. Tất nhiên, nếu bạn cần biến SQLCMD có sẵn trong ngữ cảnh T-SQL chính và không chỉ là biến T-SQL (ví dụ, nếu bạn đang sử dụng biến này làm tiền tố Máy chủ được Liên kết hoặc Tiền tố cơ sở dữ liệu dọc theo dòng UPDATE $(DomainPrefix)[DatabaseName].[dbo].[TableName]... nơi $(DomainPrefix) thường được định nghĩa như [LinkedServerName].), sau đó bạn sẽ có thể nhận được ngay với sử dụng một Value của /**/ (hoặc thậm chí /* Live */) để kết quả T-SQL sẽ hiểu là một trong hai:

UPDATE [LinkedServerName].[DatabaseName].[dbo].[TableName]... 

hoặc:

UPDATE /* Live */[DatabaseName].[dbo].[TableName]... 

cả hai đều là T-SQL hợp lệ và hoạt động. Vì vậy, trong trường hợp này, bạn sẽ sử dụng các mục sau:

<SqlCmdVariable Include="DomainPrefix"> 
    <Value>/* Live */</Value> 
</SqlCmdVariable> 
+0

Thông minh và tôi có thể xem cách giải quyết vấn đề của bạn. Đó là một lý do tôi đã cố gắng tìm ra nơi bạn đang sử dụng biến và cho mục đích gì. :) –

+0

@PeterSchott Cảm ơn :-). Tuy nhiên, tôi không phải là O.P. ;-) –

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