Devo refactoring e documentare una serie di foo.sql
domande che saranno condivise da un team di supporto tecnico DB (per configurazioni dei clienti e cose del genere). Esistono tipi di ticket che arrivano regolarmente in cui ogni cliente ha i propri server e database, ma per il resto lo schema è lo stesso su tutta la linea.
Le procedure memorizzate non sono un'opzione al momento attuale. Sto discutendo se usare Dynamic o SQLCMD, non ne ho usato granché perché sono un po 'nuovo su SQL Server.
Scripting SQLCMD Mi sento decisamente "più pulito" per me, più facile da leggere e apportare piccole modifiche alle query secondo necessità, ma costringe anche l'utente ad abilitare la modalità SQLCMD. La dinamica è più difficile poiché l'evidenziazione della sintassi è una perdita dovuta alla scrittura della query mediante la manipolazione di stringhe.
Questi vengono modificati ed eseguiti utilizzando Management Studio 2012, versione SQL 2008R2. Quali sono alcuni dei pro / contro di entrambi i metodi o alcune delle "best practice" di SQL Server su un metodo o sull'altro? Uno di questi è "più sicuro" dell'altro?
Esempio dinamico:
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);
Esempio 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
affermazione potrebbe probabilmente essere lasciata fuori, poiché l'ambito non verrà comunque modificato durante questo particolare script. Ho un numero limitato di casi d'uso in cui ci saranno ricerche tra server ma che potrebbero andare oltre lo scopo di questo post.
use ...
tua sceneggiatura? È importante per la corretta esecuzione della query successiva? Sto chiedendo perché se la modifica del database corrente è uno dei risultati previsti della query, la versione SQL dinamica lo modificherà solo nell'ambito della query dinamica, non nell'ambito esterno, a differenza della variazione SQLCMD (che, di ovviamente, ha un solo scopo).