Мені доведеться перефактурувати і задокументувати ряд foo.sql
запитів, якими поділятиметься команда технічної підтримки БД (для конфігурацій клієнтів і подібних речей). Існують типи квитків, які регулярно надходять, коли кожен клієнт має власні сервери та бази даних, але в іншому випадку схеми є однаковими для всіх.
Збережені процедури не є варіантом на даний момент. Я обговорюю, чи використовувати динамічний або 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 (що, з Звичайно, має лише одну сферу застосування).