Khi sử dụng chế độ SQLCMD với SSMS (không phải từ dòng lệnh), có cách nào để gán máy chủ và cá thể hiện tại cho một biến không? Điều này khác và khác với việc gán các biến TSQL thông thường.
Định nghĩa vấn đề
Tôi muốn sử dụng sức mạnh của việc mở rộng biến của SQLCMD để thay thế các giá trị cụ thể của môi trường trong các tập lệnh triển khai của chúng tôi thay vì xây dựng chuỗi tsql hiện có mà tôi đã bước vào. Với một ngoại lệ của môi trường hiện tại, việc sử dụng SQLCMD để xử lý các triển khai đã diễn ra rất tốt.
--
-- define 2 sqlcmd variables that will be expanded in scripts
--
:setvar dbServer "DEVA2\DEV2"
:setvar dbNotServer @@servername
SELECT
'$(dbServer)' AS hard_coded_value
, @@servername AS [servername]
, '$(dbNotServer)' AS dbNotServer
Và điều đó tạo ra kết quả sau đây.
hard_coded_value servername dbNotServer
DEVA2\DEV2 DEVA2\DEV2 @@servername
Meat Loaf nói rằng 2 trong số 3 điều đó không tệ , nhưng tôi muốn có 3 trên 3 giải pháp. Khi tập lệnh đó được triển khai máy chủ thử nghiệm, tôi không muốn tin tưởng những người triển khai với việc chỉnh sửa tập lệnh.
Nếu giải pháp duy nhất để sử dụng SQLCMD là gọi hoàn toàn các tập lệnh từ dòng lệnh, tôi có thể chấp nhận điều đó nhưng muốn ném nó ra đây vì tôi sử dụng SQLCMD.
Sản phẩm chất lượng
:setvar dbNotServer @@servername
SELECT '$(dbNotServer)' AS worked
Các kết quả
worked
DEVA\DEV2
Theo đuổi không có kết quả
Liên kết BOL đầu tiên cho thấy lời hứa, tất cả những gì tôi phải làm là sử dụng SQLCMDSERVER nhưng không có kết quả. Chạy trong bối cảnh SSMS ở chế độ SQLCMD, nó sẽ gây ra lỗi kịch bản nghiêm trọng
-- A fatal scripting error occurred.
-- Variable SQLCMDSERVER is not defined.
SELECT '$(SQLCMDSERVER)' AS [FatalScriptingError]
Cập nhật Tumbleweed
2011-08-12 Trong nỗ lực chuyển vấn đề của tôi sang dạng đơn giản nhất, dựa trên các câu trả lời, tôi đã quá đơn giản các truy vấn của mình (lời xin lỗi của tôi). Một phần của truy vấn tôi sử dụng là dưới đây. Hai câu trả lời đúng trong câu trả lời của họ xác định gói @@ servername trong dấu tick dẫn đến giá trị theo nghĩa đen và để có được giá trị mở rộng, tôi cần phải mở khóa từ dấu ngoặc kép. Mong muốn của tôi là sử dụng thay thế biến sqlcmd thay vì xây dựng chuỗi mà unsrap sẽ đòi hỏi.
INSERT INTO
dbo.SSISCONFIG
(
ConfigurationFilter
, ConfiguredValue
, PackagePath
, ConfiguredValueType
, Application
, Category
, Subcategory
, Comment
)
SELECT
'Default.Accounting' AS ConfigurationFilter
, 'Data Source=$(dbServer);Initial Catalog=Accounting;Provider=SQLNCLI10.1;Integrated Security=SSPI;Packet Size=32767;' AS ConfiguredValue
, '\Package.Connections[Accounting].Properties[ConnectionString]' AS PackagePath
, 'String' AS ConfiguredValueType
, 'Defaults' AS Application
, 'Connection' AS Category
, 'Database' AS Subcategory
, 'Default connection string' AS Comment
SELECT
'Default.$(sqlVersion).CorporateReporting' AS ConfigurationFilter
, 'Data Source=$(dwServer);Initial Catalog=CRDS;Provider=SQLNCLI10.1;Integrated Security=SSPI;Packet Size=32767;' AS ConfiguredValue
, '\Package.Connections[CorporateReporting].Properties[ConnectionString]' AS PackagePath
, 'String' AS ConfiguredValueType
, 'Defaults' AS Application
, 'Connection' AS Category
, 'Database' AS Subcategory
, 'Default connection string' AS Comment
Lệnh gọi dòng lệnh hoạt động (như mong đợi)
C:\>sqlcmd -E -d master -S DEVA2\DEV2 -Q "SELECT '$(SQLCMDSERVER)' AS [servername]"
Tôi đã thử và loại bỏ các hoán vị khác của: setvar x @@ servername trong nỗ lực lấy giá trị ước tính của biến cơ sở dữ liệu được lưu trữ trong biến SQLCMD. Tại thời điểm này, tôi khá chắc chắn các biến sqlcmd bị ảnh hưởng trong các truy vấn trước khi kết hợp truy vấn nhưng rất thích được chứng minh là sai.