ฉันต้องรีแฟคเตอร์และจัดทำเอกสาร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 (ซึ่ง แน่นอนมีขอบเขตเดียวเท่านั้น)