2014-03-04 192 views
0

使用變量是否有可能做這樣的事情:在查詢數據庫名稱

DECLARE @SourceDB VARCHAR(100); 
SET @SourceDB = [DatabaseName] 


INSERT INTO CompletedScope 
(uidInstanceID , 
    completedScopeID , 
    state , 
    modified 
) 
SELECT uidInstanceID , 
     completedScopeID , 
     state , 
     modified 
FROM SourceDB.[dbo].CompletedScope; 

基本上使用聲明SOURCEDB變量中的查詢。

+0

你試過了嗎?結果是什麼? – abatishchev

+1

任何時候你需要參數化一個對象的名稱(列,表,數據庫等),你需要使用動態sql –

+0

你不能使用這樣的表名,你需要動態sql,把一個字符串放入一個變量然後執行它。 – Mihai

回答

4

您將需要使用這個動態SQL ...

DECLARE @SourceDB NVARCHAR(128), @Sql NVARCHAR(MAX); 
SET @SourceDB = 'DatabaseName'; 


SET @Sql = N'INSERT INTO CompletedScope 
        (uidInstanceID , 
         completedScopeID , 
         state , 
         modified 
        ) 
      SELECT uidInstanceID , 
        completedScopeID , 
        state , 
        modified 
      FROM ' + QUOTENAME(@SourceDB) + '.[dbo].CompletedScope;' 

EXECUTE sp_executesql @Sql 

使用串聯變量到SQL時QUOTENAME()功能,保護您對SQL注入攻擊。

3

您可以使用動態查詢

SELECT @sql= 
'INSERT INTO CompletedScope 
     (uidInstanceID , 
      completedScopeID , 
      state , 
      modified 
     ) 
SELECT uidInstanceID , 
     completedScopeID , 
     state , 
     modified 
FROM ' + @SourceDB + '.[dbo].CompletedScope;' 

EXEC sp_executesql @sql