Sql-Server
將連結伺服器儲存在儲存過程變數中
我有以下設置:
伺服器 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;