ฉันจะเขียน SQL แบบพกพาที่อ้างถึงเซิร์ฟเวอร์ที่เชื่อมโยงได้อย่างไร


9

ฉันมีขั้นตอนการจัดเก็บที่อ้างอิงถึงเซิร์ฟเวอร์ที่เชื่อมโยง ในหลาย ๆ ที่ตลอดกระบวนการฉันมีบางอย่างดังต่อไปนี้:

INSERT INTO [TableName]
(...Columns...)
SELECT ...Columns...
FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName]
WHERE TableNameID = @TableNameID

ขั้นตอนนี้มีอยู่ในสภาพแวดล้อมการพัฒนาของฉันสภาพแวดล้อมการทดสอบและสภาพแวดล้อมแบบสด

ปัญหาคือแต่ละสำเนาของโพรซีเดอร์นั้นแตกต่างกันอย่างละเอียดเนื่องจากชื่อเซิร์ฟเวอร์แตกต่างกันสำหรับแต่ละสภาพแวดล้อม สิ่งนี้ทำให้การจัดการการปรับใช้การอัปเดตสคริปต์ลำบาก

มีวิธีทำให้โพรซีเดอร์แบบพกพาเพื่อให้แต่ละสภาพแวดล้อมสามารถรันเวอร์ชันที่เหมือนกันได้หรือไม่?

ถ้าไม่มีอะไรที่ฉันสามารถทำได้เพื่อให้การปรับใช้สคริปต์มีแนวโน้มที่จะเกิดข้อผิดพลาด / ข้อผิดพลาดน้อยลง


3
การสร้างมุมมองที่แตกต่างกันในแต่ละเซิร์ฟเวอร์เป็นตัวเลือกหรือไม่? คุณสามารถกำหนดมุมมองเป็นSELECT <fields> FROM <linked server>แต่ใช้ชื่อมุมมองเดียวกันกับเซิร์ฟเวอร์ทั้งหมดเพื่อรักษารหัส
JNK

@JNK นั้นไม่ใช่ความคิดที่ดี แต่ก็มีตารางไม่กี่ตาราง แต่อย่างน้อยก็มุมมองก็จะง่ายกว่าที่จะรักษามากกว่าขั้นตอนการจัดเก็บที่มีการอ้างอิงเซิร์ฟเวอร์ที่เชื่อมโยงซึ่งมีการอ้างอิงตลอด
หมอโจนส์

@ jnk คุณควรตอบคำถามนั้น
HLGEM

คำตอบ:


14

ชื่อของเซิร์ฟเวอร์ที่เชื่อมโยงของคุณไม่จำเป็นต้องเป็นชื่อของเซิร์ฟเวอร์ คุณสามารถใช้ชื่อสามัญ

EXEC master.dbo.sp_addlinkedserver
    @server = N'COMMONNAME',
    @srvproduct=N'MSDASQL',
    @provider=N'SQLNCLI',
    @provstr=N'DRIVER={SQL Server};SERVER=ACTUALSERVERNAME;UID=user1;PWD=rosebud567;', 
    @catalog=N'database1'

ตั้งค่าเซิร์ฟเวอร์ที่เชื่อมโยงในแต่ละสภาพแวดล้อมด้วยชื่อเดียวกัน แต่จริงๆแล้วชี้ไปที่เซิร์ฟเวอร์ต่าง ๆ


0

ฉันชอบความคิดในการใช้ชื่อเซิร์ฟเวอร์ที่เชื่อมโยงทั่วไป อย่างไรก็ตามในหลาย ๆ สภาพแวดล้อมสิ่งนี้อาจเป็นไปไม่ได้ในกรณีนี้คุณสามารถใช้ไดนามิก SQl ใน sp ของคุณ

declare @linkedservername nvarchar(200)
declare @sql nvarchar(4000)
SET @linkedservername =  CASE @@ServerName  
                            WHEN 'DevServer' THEN 'LinkedServerForDevEnvironment'
                            WHEN 'TestServer' THEN 'LinkedServerForTestEnvironment'
                            WHEN 'ProdServer' THEN 'LinkedServerForProdEnvironment'
                            ELSE Null
                        END   

set @sql = 'INSERT INTO [TableName] 
(...Columns...) 
SELECT ...Columns... 
FROM ' + @linkedservername + '.[Catalogue].[dbo].[TableName] 
WHERE TableNameID = @TableNameID'

Exec  @sql

1
ฉันจะทราบว่าถ้าฉันทำสิ่งนี้ในชีวิตจริงฉันจะใช้ try catch block และทำให้เกิดข้อผิดพลาดหาก @linkedservername เป็นโมฆะหลังจากที่ชุดคำสั่งเตือนคุณว่านี่เป็นเซิร์ฟเวอร์ที่ไม่ถูกต้อง
HLGEM

1
หากคุณใช้วิธีนี้ฉันคิดว่าฉันจะใส่คำสั่ง CASE ในฟังก์ชั่นดังนั้นหากเซิร์ฟเวอร์มีการเปลี่ยนแปลงฉันจะต้องอัปเดตฟังก์ชันเท่านั้น
อีไล

จุดดี @Eli
HLGEM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.