Bağlantılı bir sunucuya başvuran taşınabilir SQL'i nasıl yazarım?


9

Bağlantılı bir sunucuya başvuran saklı yordam var. Prosedür boyunca çeşitli yerlerde aşağıdaki gibi bir şey var:

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

Bu yordam Geliştirme ortamımda, Test ortamımda ve Canlı ortamımda var.

Sorun, sunucu adlarının her ortam için farklı olması nedeniyle yordamın her kopyasının oldukça farklı olmasıdır. Bu, komut dosyası güncelleştirmelerinin dağıtımını yönetmeyi zahmetli hale getirir.

Her ortamın aynı sürümlerini çalıştırabilmesi için yordamı taşınabilir yapmanın bir yolu var mı?

Değilse, komut dosyası dağıtımını hatalara / hatalara daha az eğilimli yapmak için yapabileceğim bir şey var mı?


3
Her sunucuda farklı bir görünüm oluşturmak bir seçenek midir? Görünümü şu şekilde tanımlayabilirsiniz, SELECT <fields> FROM <linked server>ancak kodu korumak için tüm sunucularda aynı görünüm adını kullanabilirsiniz
JNK

@JNK bu kötü bir fikir değil, yine de birkaç tablo var, ancak en azından görünümleri korumak, bağlantılı sunucu referansları ile karalanmış bir prosedürden daha kolay olacaktır.
Doktor Jones

@jnk, buna bir cevap vermelisin.
HLGEM

Yanıtlar:


14

Bağlı sunucunuzun adı, sunucunun adı olmak zorunda değildir. Genel bir ad kullanabilirsiniz.

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'

Bağlantılı sunucuyu aynı ada sahip her ortama kurun, ancak aslında farklı sunuculara yönlendirin.


0

Genel bağlantılı sunucu adı kullanma fikrini seviyorum. Ancak, birçok ortamda bu mümkün olmayabilir, Bu durumda, 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
Bunu gerçek hayatta yapsaydım, bir try catch bloğu kullanacak ve eğer yanlış sunucuda çalıştırıldığına dair sizi uyarmak için set deyiminden sonra @linkedservername null olsaydı bir hata oluşturacağım.
HLGEM

1
Bu yaklaşımı aldıysanız, bir sunucu değiştiyse, CASE deyimini bir işlevde sararım, sadece işlevi güncellemem gerekir.
Eli

@Eli
HLGEM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.