Sql-Server

將連結伺服器儲存在儲存過程變數中

  • January 6, 2020

我有以下設置:

伺服器 1:CGENMONOSAMP01

伺服器 2:CGENMONOSAMP02

我將伺服器 2 連結到伺服器 1 並且連結有效,我可以在伺服器 1 上進行這樣的查詢:

SELECT * FROM [CGENMONOSAMP02].master.dbo.sysdatabases

它檢索伺服器 2 上的數據庫列表。

我正在嘗試創建以下內容:

   DECLARE @SourceDatabase varchar(50) = '[CGENMONOSAMP02].Sample_DB'
   DECLARE @SourceHost varchar(50) = (SELECT SUBSTRING(@SourceDatabase, 2, 14))
   DECLARE @SourceDB varchar(50) = (SELECT SUBSTRING(@SourceDatabase, 18, 100))

--@SourceHost is CGENMONOSAMP02

--@SourceDB is Sample_DB

   IF NOT EXISTS (SELECT [name] FROM master.dbo.sysdatabases WHERE [name] = @SourceDatabase)
   BEGIN
       IF NOT EXISTS (SELECT [name] FROM @SourceHost.master.dbo.sysdatabases WHERE [name] = @SourceDB) 
       BEGIN
       RAISERROR ('Error: Source Database[%s] is not existing.', 10, 1,@SourceDatabase)
       RETURN
       END
   END

這是在伺服器 1 上呼叫的,它應該採用 DB 名稱,它可以是位於的 DB 名稱

在伺服器 1 上為:“Sample_Table”

或者它可以是位於的數據庫的名稱

在伺服器 2 上為:“

$$ CGENMONOSAMP02 $$.Sample_Table" 它應該首先檢查本地伺服器上是否存在傳遞的數據庫名稱,如果不存在 - 它應該檢查它是否存在於連結伺服器上。

我已經嘗試了上述方法,它給了我:

‘.’ 附近的語法不正確。

我也試過:

IF NOT EXISTS (SELECT [name] FROM [@SourceHost].master.dbo.sysdatabases WHERE [name] = @SourceDB) 

但這給了我:

在 sys.servers 中找不到伺服器“@SourceHost”。驗證是否指定了正確的伺服器名稱。

可以做這樣的參考嗎?

使用參數時,您可以使用動態 sql 檢查連結伺服器中是否存在數據庫。

一個例子:

DECLARE @SourceHost nvarchar(50) = '[CGENMONOSAMP02]';
DECLARE @SourceDB nvarchar(50) = 'Sample_DB';
--@SourceHost is CGENMONOSAMP02

--@SourceDB is Sample_DB
CREATE TABLE #temp ([name] nvarchar(50));
IF NOT EXISTS (SELECT [name] FROM master.sys.databases WHERE [name] = @SourceDB)
BEGIN
   DECLARE @SQL NVARCHAR(MAX);
   SET @SQL = 'SELECT [name] FROM '+@SourceHost+'.[master].[sys].[databases] WHERE [name] = @SourceDB ';

   INSERT INTO #temp([name])
   EXEC SP_EXECUTESQL @SQL,N'@SourceDB nvarchar(50)',@SourceDB;

   IF NOT EXISTS(SELECT [name] FROM #temp)
   BEGIN
       RAISERROR ('Error: Source Database[%s] is not existing.', 10, 1,@SourceDB);
   END
END

DROP TABLE #temp;

引用自:https://dba.stackexchange.com/questions/256768