Ben foo.sql
DB teknik destek ekibi (müşteri yapılandırmaları ve bunun gibi şeyler için) tarafından paylaşılacak bir dizi sorguları yeniden gözden geçirmek ve belgelemek zorunda. Her müşterinin kendi sunucularına ve veritabanlarına sahip olduğu düzenli olarak gelen bilet türleri vardır, ancak aksi takdirde şema genel olarak aynıdır.
Saklı yordamlar şu anda bir seçenek değildir. Dinamik veya SQLCMD kullanmak tartışıyorum, SQL Server'da biraz yeni olduğum için ya da çok fazla kullanmadım.
SQLCMD komut dosyaları Bana kesinlikle "daha temiz" görünüyor ve gerektiğinde sorguları okumak ve küçük değişiklikler yapmak daha kolay, ama aynı zamanda kullanıcıyı SQLCMD modunu etkinleştirmeye zorluyor. Dinamik, sözdizimi vurgulaması, dize manipülasyonu kullanılarak yazılan sorgu nedeniyle kaybedildiğinden daha zordur.
Bunlar Management Studio 2012, SQL 2008R2 sürümü kullanılarak düzenleniyor ve çalıştırılıyor. Herhangi bir yöntemin bazı artıları / eksileri veya bir yöntem veya diğeri SQL Server "en iyi uygulamaları" bazıları nelerdir? Biri diğerinden "daha güvenli" mi?
Dinamik örnek:
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 örneği:
: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
komut dosyasında kapsam yine de değiştirilmeyeceğinden, ifade büyük olasılıkla dışarıda bırakılabilir. Çapraz sunucu aramaları olacak ama bu yazının kapsamı dışında olabilir kullanım vakaları az sayıda var.
use ...
Senaryonuzun amacı nedir ? Sonraki sorgunun doğru yürütülmesi için önemli mi? Ben soruyorum çünkü geçerli veritabanını değiştirmek sorgunuzun beklenen sonuçlardan biri, dinamik SQL sürümü SQLCMD varyasyon (aksine, dış kapsamda değil, yalnızca dinamik sorgu kapsamında değiştirir ders, sadece bir kapsamı vardır).