Chế độ SQLCMD trong SSMS và @@ mở rộng biến


8

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.

Tài liệu tham khảo BOL

Câu trả lời:


3

Các biến SQL-CMD được đánh giá trước khi lô chạy. Vì vậy, bạn không thể gán giá trị biến t-sql cho biến CMD.


Nó chắc chắn xuất hiện theo cách đó. Bạn có biết bất kỳ tài liệu nêu rõ điều này là như vậy?
billinkc

3

Trừ khi tôi thiếu một cái gì đó, không phải công việc này, không có dấu nháy đơn?:

:setvar dbNotServer @@servername
SELECT $(dbNotServer) AS worked

Nó trả về SERVER \ INSTANCE cho tôi trong chế độ SQLCMD thông qua SSMS.

Chỉnh sửa 02/12/2018 Sau khi đi qua câu trả lời của tôi cho một câu hỏi khác, và xem xét, tôi có thể thấy vấn đề, tôi tin rằng nó giải quyết vấn đề này:

:setvar dbNotServer @@servername
print '$(dbNotServer)'

Đầu ra này @@ servername và đầu ra mong muốn là giá trị của @@ servername. Cách duy nhất tôi thấy để làm điều này là trong câu trả lời được chấp nhận ở đây


1
Bạn chỉ cần thay thế chuỗi @@servernamecho $(dbNotServer)SQL được gửi để thực thi là SELECT @@servername AS worked. Không có sự gán giá trị của @@servername biến sqlcmd như yêu cầu.
Martin Smith

1

Trong "Đầu ra mong muốn", T-SQL đi đến máy chủ sẽ trở thành:

SELECT '@@servername' AS worked

Đặt dấu ngoặc đơn xung quanh @@servernamelàm cho nó thành một chuỗi theo nghĩa đen và sẽ không được thay thế bằng tên thực, đó là lý do tại sao bạn đang xem @@servernamelà giá trị.

Nếu bạn đang tìm cách hiển thị tên máy chủ, hãy xóa các dấu ngoặc đơn, tạo T-SQL của bạn:

SELECT @@servername AS worked

Tôi không hoàn toàn rõ ràng Tôi hiểu câu hỏi, nhưng đây là cách bạn sẽ có được những gì trong "Đầu ra mong muốn" của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.