Bagikan melalui


Menggunakan sqlcmd dengan variabel pembuatan skrip

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistem Platform Analitik (PDW)Database SQL di Microsoft Fabric

Utilitas sqlcmd memungkinkan Anda memasukkan pernyataan Transact-SQL, prosedur sistem, dan file skrip.

Note

Untuk mengetahui varian dan versi sqlcmd mana yang diinstal pada sistem Anda, lihat Memeriksa versi utilitas sqlcmd yang diinstal. Untuk informasi tentang cara mendapatkan sqlcmd, lihat Mengunduh dan menginstal utilitas sqlcmd.

Variabel pembuatan skrip dalam sqlcmd

Variabel yang digunakan dalam skrip disebut variabel pembuatan skrip. Variabel pembuatan skrip memungkinkan satu skrip digunakan dalam beberapa skenario. Misalnya, jika Anda ingin menjalankan satu skrip terhadap beberapa server, alih-alih memodifikasi skrip untuk setiap server, Anda dapat menggunakan variabel pembuatan skrip untuk nama server. Dengan mengubah nama server yang disediakan ke variabel pembuatan skrip, skrip yang sama dapat dijalankan di server yang berbeda.

Variabel pembuatan skrip dapat didefinisikan secara eksplisit dengan menggunakan setvar perintah , atau secara implisit dengan menggunakan sqlcmd -v opsi .

Artikel ini juga menyertakan contoh yang menentukan variabel lingkungan di baris perintah dengan menggunakan SET.

Mengatur variabel pembuatan skrip dengan perintah setvar

Perintah setvar menentukan variabel pembuatan skrip. Variabel yang ditentukan dengan menggunakan setvar perintah disimpan secara internal. Variabel pembuatan skrip tidak boleh dikacaukan dengan variabel lingkungan yang ditentukan pada prompt perintah dengan menggunakan SET. Jika skrip mereferensikan variabel yang bukan variabel lingkungan atau tidak ditentukan dengan menggunakan setvar, pesan kesalahan dikembalikan dan eksekusi skrip berhenti. Untuk informasi selengkapnya, lihat -b opsi di sqlcmd.

Prioritas variabel (rendah hingga tinggi)

Jika lebih dari satu jenis variabel memiliki nama yang sama, variabel dengan prioritas tertinggi digunakan.

  1. Variabel lingkungan tingkat sistem
  2. Variabel lingkungan tingkat pengguna
  3. Shell perintah (SET X=Y) diatur pada prompt perintah sebelum memulai sqlcmd
  4. sqlcmd -v X=Y
  5. :Setvar X Y

Note

Untuk melihat variabel lingkungan pada Windows 11, buka Pengaturan, lalu navigasi ke Tentang Sistem>, dan pilih tautan Pengaturan sistem tingkat lanjut. Di jendela Properti Sistem, pilih Variabel Lingkungan. Di Linux, ketik printenv di baris perintah, dan di macOS, ketik env.

Mengatur variabel skrip secara implisit

Saat Anda memulai sqlcmd dengan opsi yang memiliki variabel sqlcmd terkait, variabel sqlcmd diatur secara implisit ke nilai yang ditentukan dengan menggunakan opsi . Dalam contoh berikut, sqlcmd dimulai dengan opsi -l. Ini mengatur variabel SQLLOGINTIMEOUT secara implisit.

sqlcmd -l 60

Anda juga dapat menggunakan -v opsi untuk mengatur variabel pembuatan skrip yang ada dalam skrip. Dalam skrip berikut (nama file adalah testscript.sql), ColumnName adalah variabel pembuatan skrip.

USE AdventureWorks2022;

SELECT x.$(ColumnName)
FROM Person.Person x
WHERE x.BusinessEntityID < 5;

Anda kemudian dapat menentukan nama kolom yang ingin Anda kembalikan dengan menggunakan -v opsi :

sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sql

Untuk mengembalikan kolom yang berbeda dengan menggunakan skrip yang sama, ubah nilai ColumnName variabel pembuatan skrip.

sqlcmd -v ColumnName ="LastName" -i c:\testscript.sql

Panduan untuk membuat skrip nama dan nilai variabel

Pertimbangkan panduan berikut saat Anda memberi nama variabel pembuatan skrip:

  • Nama variabel tidak boleh berisi karakter spasi kosong atau tanda kutip.

  • Nama variabel tidak boleh memiliki formulir yang sama dengan ekspresi variabel, seperti $(var).

  • Variabel skrip tidak membedakan huruf besar/kecil

    Note

    Jika tidak ada nilai yang ditetapkan ke variabel lingkungan sqlcmd , variabel akan dihapus. Menggunakan :setvar VarName tanpa nilai akan menghapus variabel.

Pertimbangkan panduan berikut saat Anda menentukan nilai untuk variabel pembuatan skrip:

  • Nilai variabel yang ditentukan dengan menggunakan setvar atau -v opsi harus diapit oleh tanda kutip jika nilai string berisi spasi.
  • Jika tanda kutip merupakan bagian dari nilai variabel, tanda kutip tersebut harus di-escape. Misalnya: :setvar MyVar "spac""e".

Panduan mengenai nilai dan nama variabel pada cmd.exe SET

Variabel yang ditentukan dengan menggunakan SET adalah bagian dari lingkungan cmd.exe dan dapat dirujuk oleh sqlcmd. Pertimbangkan panduan berikut:

  • Nama variabel tidak boleh berisi karakter spasi kosong atau tanda kutip.
  • Nilai variabel mungkin berisi spasi atau tanda kutip.

variabel pembuatan skrip sqlcmd

Variable Opsi terkait R/W Default
SQLCMDUSER 1 -U R 2 ""
SQLCMDPASSWORD 1 -P -- ""
SQLCMDSERVER 1 -S R 2 "DefaultLocalInstance"
SQLCMDWORKSTATION -H R 2 "ComputerName"
SQLCMDDBNAME -d R 2 ""
SQLCMDLOGINTIMEOUT -l R/W 3 "8" (detik)
SQLCMDSTATTIMEOUT -t R/W 3 "0" = tunggu tanpa batas waktu
SQLCMDHEADERS -h R/W 3 "0"
SQLCMDCOLSEP -s R/W 3 " "
SQLCMDCOLWIDTH -w R/W 3 "0"
SQLCMDPACKETSIZE -a R 2 "4096"
SQLCMDERRORLEVEL -m R/W 3 "0"
SQLCMDMAXVARTYPEWIDTH -y R/W 3 "256"
SQLCMDMAXFIXEDTYPEWIDTH -Y R/W 3 "0" = tidak terbatas
SQLCMDEDITOR R/W 3 "edit.com"
SQLCMDINI R 2 ""

1 SQLCMDUSER, SQLCMDPASSWORD dan SQLCMDSERVER diatur saat :Connect digunakan.

2 R menunjukkan nilai hanya dapat diatur satu kali selama inisialisasi program.

3 R/W menunjukkan bahwa nilai dapat direset dengan menggunakan setvar perintah dan perintah berikutnya menggunakan nilai baru.

Examples

Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.

A. Menggunakan perintah setvar dalam skrip

Banyak opsi sqlcmd dapat dikontrol dalam skrip dengan menggunakan perintah setvar . Dalam contoh berikut, skrip test.sql dibuat di mana SQLCMDLOGINTIMEOUT variabel diatur ke 60 detik dan variabel skrip lainnya, server, diatur ke testserver. Kode berikut ada di test.sql.

:setvar SQLCMDLOGINTIMEOUT 60
:setvar server "testserver"
:connect $(server) -l $(SQLCMDLOGINTIMEOUT)

USE AdventureWorks2022;

SELECT FirstName, LastName
FROM Person.Person;

Skrip kemudian dipanggil dengan menggunakan sqlcmd:

sqlcmd -i c:\test.sql

B. Gunakan perintah setvar secara interaktif

Contoh berikut menunjukkan cara mengatur variabel pembuatan skrip secara interaktif dengan menggunakan setvar perintah .

sqlcmd
:setvar MYDATABASE AdventureWorks2022
USE $(MYDATABASE);
GO

Berikut hasilnya.

Changed database context to 'AdventureWorks2022'
1>

C. Menggunakan variabel lingkungan dari command prompt dalam sqlcmd

Dalam contoh berikut, empat variabel are lingkungan diatur lalu dipanggil dari sqlcmd.

SET tablename=Person.Person
SET col1=FirstName
SET col2=LastName
SET title=Ms.
sqlcmd -d AdventureWorks2022
1> SELECT TOP 5 $(col1) + ' ' + $(col2) AS Name
2> FROM $(tablename)
3> WHERE Title ='$(title)'
4> GO

D. Menggunakan variabel lingkungan tingkat pengguna dalam sqlcmd

Dalam contoh berikut, variabel lingkungan tingkat pengguna disetel di prompt perintah dan diteruskan ke file input %Temp%. Untuk mendapatkan variabel lingkungan tingkat pengguna, di Panel Kontrol, klik dua kali Sistem. Pilih tab Lanjutan , lalu pilih Variabel Lingkungan.

Kode berikut ada dalam file C:\testscript.txtinput :

:OUT $(MyTempDirectory)
USE AdventureWorks2022;

SELECT FirstName
FROM AdventureWorks2022.Person.Person
WHERE BusinessEntityID < 5;

Kode berikut dimasukkan di prompt perintah:

SET MyTempDirectory=%Temp%\output.txt
sqlcmd -i C:\testscript.txt

Hasil berikut dikirim ke file C:\Documents and Settings\<user>\Local Settings\Temp\output.txtoutput .

Changed database context to 'AdventureWorks2022'.
FirstName
--------------------------------------------------
Gustavo
Catherine
Kim
Humberto

(4 rows affected)

E. Gunakan skrip startup

Skrip startup sqlcmd dijalankan saat sqlcmd dimulai. Contoh berikut mengatur variabel lingkungan SQLCMDINI. Ini adalah isi dari init.sql.

SET NOCOUNT ON
GO

DECLARE @nt_username nvarchar(128)
SET @nt_username = (SELECT rtrim(convert(nvarchar(128), nt_username))
FROM sys.dm_exec_sessions WHERE spid = @@SPID)
SELECT  @nt_username + ' is connected to ' +
rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('servername'))) +
' (' +`
rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('productversion'))) +
')'
:setvar SQLCMDMAXFIXEDTYPEWIDTH 100
SET NOCOUNT OFF
GO

:setvar SQLCMDMAXFIXEDTYPEWIDTH

Pemanggilan file init.sql ini terjadi ketika sqlcmd dimulai.

SET sqlcmdini=c:\init.sql
sqlcmd

Ini adalah keluaran.

1> <user> is connected to <server> (9.00.2047.00)

Note

Opsi -X menonaktifkan fitur skrip startup.

F. Ekspansi variabel

Contoh berikut menunjukkan bekerja dengan data dalam bentuk variabel sqlcmd .

USE AdventureWorks2022;
GO
CREATE TABLE AdventureWorks2022.dbo.VariableTest (Col1 NVARCHAR(50));
GO

Sisipkan satu baris ke dalam Col1dbo.VariableTest yang berisi nilai $(tablename).

INSERT INTO AdventureWorks2022.dbo.VariableTest (Col1)
VALUES ('$(tablename)');
GO

Pada prompt sqlcmd, ketika tidak ada variabel yang diatur sama dengan $(tablename), pernyataan berikut mengembalikan baris dan juga mengembalikan pesan "'tablename' variabel scripting tidak didefinisikan." Secara default, flag sqlcmd-b tidak diatur. Jika -b diatur, sqlcmd akan berakhir setelah kesalahan "variabel tidak ditentukan".

sqlcmd
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
2> GO
3> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
4> GO

Berikut hasilnya.

1> Col1
2> ------------------
3> $(tablename)
4>
5> (1 rows affected)

Karena variabel MyVar diatur ke $(tablename).

6> :setvar MyVar $(tablename)

Pernyataan ini mengembalikan baris dan juga mengembalikan pesan "'tablename' variabel skrip tidak ditentukan."

6> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
7> GO

1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
2> GO

Pernyataan ini mengembalikan baris data.

1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(MyVar)';
2> GO
1> SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(MyVar)';
2> GO