Ich muss eine Reihe von Änderungen vornehmen und dokumentieren foo.sql
Abfragen , die von einem Team des technischen Supports von DB geteilt werden (für Kundenkonfigurationen und ähnliches). Es gibt Arten von Tickets, bei denen jeder Kunde seine eigenen Server und Datenbanken hat, ansonsten ist das Schema auf der ganzen Linie gleich.
Gespeicherte Prozeduren sind derzeit keine Option. Ich überlege, ob ich Dynamic oder SQLCMD verwenden soll. Ich habe von beidem nicht viel verwendet, da ich bei SQL Server ein bisschen neu bin.
SQLCMD-Skripte Ich bin der Meinung, dass sie auf jeden Fall "sauberer" aussehen und nach Bedarf leichter zu lesen und geringfügige Änderungen an den Abfragen vorzunehmen sind, aber sie zwingen den Benutzer, den SQLCMD-Modus zu aktivieren. Dynamisch ist schwieriger, da die Syntaxhervorhebung aufgrund von Abfragen, die mithilfe von Zeichenfolgenmanipulation geschrieben werden, verloren geht.
Diese werden mit Management Studio 2012, SQL-Version 2008R2, bearbeitet und ausgeführt. Was sind einige der Vor- / Nachteile einer der beiden Methoden oder einige der "Best Practices" von SQL Server für die eine oder die andere Methode? Ist einer von ihnen "sicherer" als der andere?
Dynamisches Beispiel:
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);
SQLCMD-Beispiel:
: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
Anweisung könnte wahrscheinlich weggelassen werden, da der Gültigkeitsbereich in diesem speziellen Skript sowieso nicht geändert wird. Ich habe eine kleine Anzahl von Anwendungsfällen, in denen serverübergreifende Suchvorgänge durchgeführt werden, die jedoch möglicherweise den Rahmen dieses Beitrags sprengen.
use ...
in Ihrem Skript? Ist es wichtig, dass die nachfolgende Abfrage korrekt ausgeführt wird? Ich frage, weil, wenn das Ändern der aktuellen Datenbank eines der erwarteten Ergebnisse Ihrer Abfrage ist, die dynamische SQL-Version dies nur im Bereich der dynamischen Abfrage ändert, nicht im äußeren Bereich, im Gegensatz zur SQLCMD-Variante (welche von Natürlich hat nur ein Anwendungsbereich).