Come faccio a scrivere SQL portatile che si riferisce a un server collegato?


9

Ho una procedura memorizzata che fa riferimento a un server collegato. In diversi punti della procedura ho ottenuto qualcosa di simile al seguente:

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

Questa procedura esiste nel mio ambiente di sviluppo, ambiente di test e ambiente live.

Il problema è che ogni copia della procedura è leggermente diversa perché i nomi dei server sono diversi per ciascun ambiente. Ciò rende problematica la gestione della distribuzione degli aggiornamenti degli script.

C'è un modo per rendere portatile la procedura in modo che ogni ambiente possa eseguirne versioni identiche?

In caso contrario, c'è qualcosa che posso fare per rendere la distribuzione degli script meno soggetta a errori / errori?


3
La creazione di una vista che differisce su ciascun server è un'opzione? È possibile definire la vista come SELECT <fields> FROM <linked server>ma utilizzare lo stesso nome vista su tutti i server per mantenere il codice mantenuto
JNK

@JNK non è una cattiva idea, ci sono comunque alcune tabelle, ma almeno le visualizzazioni sarebbero più semplici da mantenere rispetto a una procedura memorizzata con riferimenti al server collegati in tutto.
Doctor Jones,

@jnk, dovresti dare una risposta.
HLGEM,

Risposte:


14

Il nome del tuo server collegato non deve essere il nome del server. Puoi usare un nome generico.

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'

Configurare il server collegato su ogni ambiente con lo stesso nome, ma in realtà puntarli su server diversi.


0

Mi piace l'idea di utilizzare un nome di server collegato generico. Tuttavia, in molti ambienti questo potrebbe non essere possibile. In questo caso, puoi usare SQl dinamico nel tuo 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
Noterò che se lo facessi nella vita reale, userei un blocco try catch e rimbalzerei un errore se @linkedservername fosse nullo dopo l'istruzione set per avvertirti che era stato eseguito sul server sbagliato.
HLGEM,

1
Se avessi adottato questo approccio, penso che avrei racchiuso l'istruzione CASE in una funzione, quindi se un server è cambiato, dovrei solo aggiornare la funzione.
Eli,

Buon punto
@Eli
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.