foo.sql
DB技術サポートのチームが共有する多数のクエリをリファクタリングして文書化する必要があります(顧客の構成など)。各顧客が独自のサーバーとデータベースを持っている場合に定期的に来るチケットの種類がありますが、それ以外はスキーマは全面的に同じです。
現時点では、ストアドプロシージャはオプションではありません。私は動的またはSQLCMDのどちらを使用するかを議論しています。SQLServerを少し使い始めたばかりなので、どちらもあまり使用していません。
SQLCMDスクリプティング私は間違いなく「見た目」がきれいで、必要に応じてクエリを読みやすく、小さな変更を加えやすいと感じていますが、ユーザーにSQLCMDモードを強制的に有効にします。文字列操作を使用して記述されたクエリにより、構文の強調表示が失われるため、動的はより困難になります。
これらは、Management Studio 2012、SQLバージョン2008R2を使用して編集および実行されています。どちらの方法の長所/短所、またはいずれかの方法でのSQL Serverの「ベストプラクティス」の一部は何ですか?それらの1つは他よりも「安全」ですか?
動的な例:
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の例:
: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
スコープは、とにかく、この特定のスクリプト中に変更されることはありませんよう文はおそらく、省略することができます。クロスサーバー検索が行われるいくつかのユースケースがありますが、それはこの投稿の範囲外です。
use ...
スクリプトでの目的は何ですか?後続のクエリを正しく実行することは重要ですか?現在のデータベースの変更がクエリの期待される結果の1つである場合、動的SQLバージョンは、SQLCMDバリエーション(これは、もちろん、スコープは1つだけです)。