Tôi phải cấu trúc lại và ghi lại một số foo.sql
truy vấn sẽ được chia sẻ bởi một nhóm hỗ trợ công nghệ DB (đối với cấu hình của khách hàng và những thứ tương tự). Có những loại vé xuất hiện thường xuyên trong đó mỗi khách hàng có máy chủ và cơ sở dữ liệu riêng, nhưng nếu không thì lược đồ là giống nhau trên bảng.
Thủ tục lưu trữ không phải là một lựa chọn tại thời điểm hiện tại. Tôi đang tranh luận về việc nên sử dụng động hay SQLCMD, tôi chưa sử dụng nhiều vì tôi hơi mới ở SQL Server.
Kịch bản SQLCMD tôi cảm thấy chắc chắn "trông" sạch hơn đối với tôi, và dễ đọc hơn và thực hiện các thay đổi nhỏ đối với các truy vấn khi cần, nhưng cũng buộc người dùng kích hoạt chế độ SQLCMD. Động khó hơn vì việc tô sáng cú pháp bị mất do truy vấn được viết bằng thao tác chuỗi.
Chúng đang được chỉnh sửa và chạy bằng Management Studio 2012, SQL phiên bản 2008R2. Một số ưu / nhược điểm của một trong hai phương thức hoặc một số "thực tiễn tốt nhất" của SQL Server đối với phương pháp này hay phương pháp khác là gì? Là một trong số họ "an toàn" hơn so với người khác?
Ví dụ động:
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);
Ví dụ 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
tuyên bố có thể có thể được bỏ qua, như phạm vi sẽ không được thay đổi trong kịch bản này đặc biệt anyways. Tôi có một số ít trường hợp sử dụng trong đó sẽ có các tìm kiếm trên máy chủ chéo nhưng điều đó có thể vượt quá phạm vi của bài đăng này.
use ...
kịch bản của bạn là gì? Có quan trọng đối với việc thực hiện đúng của truy vấn tiếp theo không? Tôi hỏi vì nếu thay đổi cơ sở dữ liệu hiện tại là một trong những kết quả mong đợi của truy vấn của bạn, phiên bản SQL động sẽ chỉ thay đổi trong phạm vi của truy vấn động, không phải trong phạm vi bên ngoài, không giống như biến thể SQLCMD (mà, của Tất nhiên, chỉ có một phạm vi).