Zrobiłem trochę więcej badań, więc oto moje zrozumienie tego, aby rozszerzyć to, co zostało napisane do tej pory:
Co to jest SQLCMD
SQLCMD.exe
to narzędzie konsoli zawarte w instalacji SQL Server 2005 i nowszych. Zazwyczaj można go znaleźć w ścieżce, takiej jak c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
.
Jest to proste środowisko skryptowe umożliwiające automatyzację zadań związanych z serwerem SQL. Na przykład możesz napisać i wykonać skrypt, który zaloguje się do określonej instancji SQL Server, wykona skrypty z podanego katalogu na tym połączeniu i zapisze dane wyjściowe w określonym pliku.
Invoke-Sqlcmd
Polecenie cmdlet zostało wprowadzone w SQL Server 2008 jako sposób na zastąpienie tego narzędzia standardowym podejściem opartym na Powershell, zachowując większość oryginalnej składni i funkcjonalności.
Co to jest tryb SQLCMD w SSMS
W SSMS, tryb SQLCMD to tryb wykonywania skryptu, który symuluje środowisko sqlcmd.exe i dlatego akceptuje niektóre polecenia, które nie są częścią języka T-SQL.W przeciwieństwie do sqlcmd.exe
, kontaktuje się z bazą danych za pomocą SqlClient (tak samo jak SSMS), a nie ODBC dostawca danych, więc w niektórych aspektach może działać inaczej niż sqlcmd.exe
.
Wykonywanie skryptów w trybie SQLCMD pozwala na użycie poleceń typowych dla sqlcmd.exe
środowisko. Jednak nie ma obsługi technologii IntelliSense ani debugowania dla trybu SQLCMD, więc utrzymywanie skryptów, które łączą czysty T-SQL z kodem specyficznym dla SQLCMD, może być uciążliwe. Dlatego należy go używać tylko wtedy, gdy jest to konieczne.
Przykładowy przypadek użycia
Załóżmy, że w firmie obowiązuje konwencja nazewnictwa baz danych zawierających w nazwie środowisko, np.:MyDb_Prod , MyDb_Test , MyDb_Programowanie . Ta konwencja może być wykorzystana do minimalizacji szans na błędy .
Kiedy programista pisze skrypt T-SQL, będzie musiał zostać wykonany w różnych środowiskach w procesie wdrażania/testowania, co wymagałoby wielu wersji kodu:
SELECT *
FROM [MyDb_Dev].[dbo].[MyTable1] -- MyDb_Dev -> MyDb_Test -> MyDb_Prod
Zamiast tego możemy założyć, że nazwa bazy danych zostanie podana jako zmienna SQLCMD w procesie wdrażania i będzie mieć dokładnie ten sam plik wdrożony we wszystkich środowiskach:
-- :setvar databaseName "MyDb_Dev" -- uncomment for testing in SSMS
SELECT *
FROM [$(databaseName)].[dbo].[MyTable1]
(w tym prostym przykładzie nazwa bazy danych może zostać całkowicie pominięta, ale jeśli masz połączenia między bazami danych, użycie nazwy bazy danych jest konieczne)