foo.sql
DB 기술 지원 팀 (고객 구성 및 이와 유사한 사항)이 공유 할 여러 쿼리 를 리팩터링하고 문서화 해야합니다. 각 고객마다 고유의 서버와 데이터베이스가있는 경우 정기적으로 제공되는 티켓 유형이 있지만, 그렇지 않으면 전체적으로 스키마가 동일합니다.
저장 프로시 저는 현재 옵션이 아닙니다. 동적 또는 SQLCMD를 사용할 지에 대해 토론하고 있는데 SQL Server에서 조금 새로 왔기 때문에 많이 사용하지 않았습니다.
SQLCMD 스크립팅 필자는 필자에게 "깨끗해 보이는"느낌이 들며, 필요에 따라 쿼리를 쉽게 읽고 약간의 변경을 수행 할 수 있지만 사용자는 SQLCMD 모드를 활성화해야합니다. 문자열 조작을 사용하여 작성된 쿼리로 인해 구문 강조 표시가 손실되므로 동적이 더 어렵습니다.
이들은 Management Studio 2012, SQL 버전 2008R2를 사용하여 편집 및 실행되었습니다. 두 가지 방법의 장단점은 무엇입니까? 또는 SQL Server "모범 사례"중 하나 또는 다른 방법은 무엇입니까? 그들 중 하나가 다른 것보다 "더 안전"합니까?
동적 예 :
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 ...
스크립트에서 목적은 무엇입니까 ? 후속 쿼리를 올바르게 실행하는 것이 중요합니까? 현재 데이터베이스를 변경하는 것이 쿼리의 예상 결과 중 하나 인 경우 동적 SQL 버전은 SQLCMD 변형과 달리 외부 범위가 아닌 동적 쿼리 범위에서만 데이터베이스를 변경하기 때문에 묻습니다. 물론 범위가 하나뿐입니다).