2014-03-04 132 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