Biến trong một biến khác trong chế độ SQLCMD


9

Cố gắng dọn dẹp tập lệnh SQL của tôi với chế độ SQLCMD và tôi gặp phải một vấn đề:

:setvar db_suffix "some_suffix"
:setvar some_db "some_db_$(db_suffix)"
print 'some_db: $(some_db)'

Đầu ra của nó là:

some_db: some_db_$(db_suffix)

Tuy nhiên, điều tôi mong đợi là:

some_db: some_db_some_suffix

Có cách nào để có nội suy thay đổi như thế này không?

(Lưu ý rằng các hàm T-SQL như CONCAT()sẽ không hoạt động vì tôi sẽ sử dụng biến làm tên cơ sở dữ liệu).


2
Chế độ SQLCMD chỉ thực hiện một lần vượt qua, vì vậy tôi không nghĩ rằng bạn có thể có các biến nguồn cấp dữ liệu như vậy. Bạn sẽ cần phải làm một cái gì đó bên ngoài (PowerShell?) Hoặc sử dụng tệp làm trung gian. Xem bài đăng trên blog này .
Aaron Bertrand

Câu trả lời:


13

Có cách nào để có nội suy thay đổi như thế này không?

Kinda sorta, theo một cách nào đó. Chỉ không trực tiếp.

Bạn cần ghi nhớ một số điều:

  1. Giá trị mà bạn đặt một biến thành thông qua :setvarlà một giá trị đơn giản, theo nghĩa đen. Bạn có thể thấy điều này bằng cách chỉ chạy hai dòng sau:

    :setvar var1 $(var2)
    PRINT '$(var1)';

    Trả về:

    $(var2)

    Nếu chế độ SQLCMD / SQLCMD cố phân tích phần giá trị :setvartheo bất kỳ cách nào, thì nó sẽ bị lỗi khi $(var2)không được xác định.

  2. Thay thế biến được phép trong một số lệnh SQLCMD khác.

    Điều này có nghĩa là, ví dụ, bạn có thể thực thi lệnh shell trong khi truyền biến SQLCMD cho dòng lệnh đó:

    :setvar db_suffix some_suffix
    !! echo :setvar other_db [MyDB_$(db_suffix)] > c:\TEMP\setvar.txt

    Hai dòng trên sẽ tạo / ghi đè lên một tệp, C: \ TEMP \ setvar.txt , với văn bản là ": setvar other_db [MyDB _ $ (db_suffix)]" nơi $(db_suffix)được thay thế bằng giá trị của nó là "some_suffix".

  3. Các lệnh SQLCMD trong tệp / tập lệnh được nhập thông qua :rlệnh được xử lý trong lần truyền thứ hai, cho phép các biến được đặt trong các tệp bên ngoài được phản ánh trong tập lệnh chính:

    :setvar db_suffix some_suffix
    !! echo :setvar other_db [MyDB_$(db_suffix)] > c:\TEMP\setvar.txt
    :r C:\TEMP\setvar.txt
    PRINT 'somethin_somethin: $(other_db)';

    Trả về:

    somethin_somethin: [MyDB_some_suffix]
  4. Các lệnh SQLCMD được diễn giải theo từng đợt !! Vì vậy, nếu bạn muốn thay đổi giá trị được nối, thì bạn cần tách riêng việc tạo và đọc tệp tạm thời, nếu không, giá trị bạn nhận được sẽ là giá trị cuối cùng được đặt vì tất cả các lệnh !!:rsẽ được xử lý trước các giá trị biến được thay thế và sau đó lô có thể được gửi tới SQL Server để xử lý T-SQL. Ví dụ:

    :setvar db_suffix some_suffixes
    
    !! echo :setvar other_db [MyDB_$(db_suffix)] > c:\TEMP\setvar.txt
    :r C:\TEMP\setvar.txt
    PRINT 'somethin_somethin: $(other_db)';
    
    --GO
    
    !! echo :setvar other_db [NotMyDB_$(db_suffix)22] > c:\TEMP\setvar.txt
    :r C:\TEMP\setvar.txt
    PRINT 'somethin_somethin2: $(other_db)'

    Sẽ trở lại:

    somethin_somethin: [NotMyDB_some_suffixes22]
    somethin_somethin2: [NotMyDB_some_suffixes22]

    NHƯNG, bỏ ghi chú --GOvà bạn sẽ nhận được những điều sau đây:

    somethin_somethin: [MyDB_some_suffixes]
    somethin_somethin2: [NotMyDB_some_suffixes22]

0

một chút khó khăn

:setvar var2 'aaa'
:setvar var1 "'$var2'"
PRINT '$var2  =' + $(var2);
PRINT '$var1  =' + $(var1);
PRINT '$var1  =' + REPlACE( $(var1) , '$var2' , $(var2) );

ĐẦU RA

$var2  =aaa
$var1  =$var2
$var1  =aaa

Không rõ làm thế nào điều này trả lời câu hỏi. Vui lòng chỉnh sửa để nó tạo ra đầu ra mà người hỏi đang mong đợi.
Colin 't Hart
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.