Muszę przeformułować i udokumentować szereg foo.sql
zapytań, które będą udostępniane przez zespół wsparcia technicznego DB (w przypadku konfiguracji klienta i tym podobnych). Istnieją rodzaje biletów, które przychodzą regularnie, gdy każdy klient ma własne serwery i bazy danych, ale poza tym schemat jest taki sam we wszystkich obszarach.
Procedury przechowywane nie są obecnie dostępne. Zastanawiam się, czy użyć dynamicznego, czy SQLCMD, nie używałem ich zbyt często, ponieważ jestem trochę nowy w SQL Server.
Skrypty SQLCMD Wydaje mi się, że zdecydowanie „dla mnie” wygląda na czystsze, łatwiejsze do odczytania i wprowadzania w razie potrzeby niewielkich zmian w zapytaniach, ale także zmusza użytkownika do włączenia trybu SQLCMD. Dynamika jest trudniejsza, ponieważ wyróżnianie składni jest utratą z powodu pisania zapytań przy użyciu operacji na łańcuchach.
Są one edytowane i uruchamiane za pomocą Management Studio 2012, wersja SQL 2008R2. Jakie są zalety / wady jednej z metod lub niektóre „najlepsze praktyki” programu SQL Server dotyczące jednej lub drugiej metody? Czy jeden z nich jest „bezpieczniejszy” niż drugi?
Dynamiczny przykład:
declare @ServerName varchar(50) = 'REDACTED';
declare @DatabaseName varchar(50) = 'REDACTED';
declare @OrderIdsSeparatedByCommas varchar(max) = '597336, 595764, 594594';
declare @sql_OrderCheckQuery varchar(max) = ('
use {@DatabaseName};
select
-- stuff
from
{@ServerName}.{@DatabaseName}.[dbo].[client_orders]
as "Order"
inner join {@ServerName}.{@DatabaseName}.[dbo].[vendor_client_orders]
as "VendOrder" on "Order".o_id = "VendOrder".vco_oid
where "VendOrder".vco_oid in ({@OrderIdsSeparatedByCommas});
');
set @sql_OrderCheckQuery = replace( @sql_OrderCheckQuery, '{@ServerName}', quotename(@ServerName) );
set @sql_OrderCheckQuery = replace( @sql_OrderCheckQuery, '{@DatabaseName}', quotename(@DatabaseName) );
set @sql_OrderCheckQuery = replace( @sql_OrderCheckQuery, '{@OrderIdsSeparatedByCommas}', @OrderIdsSeparatedByCommas );
print (@sql_OrderCheckQuery); -- For debugging purposes.
execute (@sql_OrderCheckQuery);
Przykład SQLCMD:
:setvar ServerName "[REDACTED]";
:setvar DatabaseName "[REDACTED]";
:setvar OrderIdsSeparatedByCommas "597336, 595764, 594594"
use $(DatabaseName)
select
--stuff
from
$(ServerName).$(DatabaseName).[dbo].[client_orders]
as "Order"
inner join $(ServerName).$(DatabaseName).[dbo].[vendor_client_orders]
as "VendOrder" on "Order".o_id = "VendOrder".vco_oid
where "VendOrder".vco_oid in ($(OrderIdsSeparatedByCommas));
use
Oświadczenie mogło być prawdopodobnie pominięte, jako zakres nie zostanie zmieniony podczas tego konkretnego scenariusza jakikolwiek. Mam niewielką liczbę przypadków użycia, w których będą przeprowadzane wyszukiwania między serwerami, ale może to wykraczać poza zakres tego postu.
use ...
twojego skryptu? Czy ważne jest prawidłowe wykonanie następnego zapytania? Pytam, ponieważ jeśli zmiana bieżącej bazy danych jest jednym z oczekiwanych wyników zapytania, dynamiczna wersja SQL zmieni ją tylko w zakresie zapytania dynamicznego, a nie w zakresie zewnętrznym, w przeciwieństwie do wariantu SQLCMD (który z oczywiście ma tylko jeden zakres).