如何在SELECT FROM中使用局部变量?

时间:2016-11-03 02:43:42

标签: sql-server

我声明了一个变量@Obj并为其分配了一个完整的表名'ODS..Account'。

DECLARE @Obj VARCHAR(255)

然后我在FROM Clause之后立即在查询中使用它。我觉得它只是一个字符串,无法充当表格对象。那么如何修复代码才能使其工作?干杯

  INSERT Control.dbo.Consistency_Check
        (Table_Name              
        ,Schema_Name             
        ,Id                      
        ,Incremental_DateTime_Column       
         )
  SELECT
         @Tab 
        ,'ODS'
        ,Id
        ,SystemModstamp
  FROM
        @Obj )

3 个答案:

答案 0 :(得分:1)

您可以将局部变量用作标量值,而不是函数。为此,您需要动态SQL:

declare @sql varchar(max);

select @sql = '
INSERT Control.dbo.Consistency_Check(Table_Name, Schema_Name, Id, Incremental_DateTime_Column)
    SELECT ''@Tab'', 'ODS', Id, SystemModstamp
    FROM @Tab
';

select @sql = replace(@sql, '@tab', @tab);

exec sp_executesql @sql;

答案 1 :(得分:0)

使用动态SQL执行此操作的方式略有不同:

    DECLARE @Obj VARCHAR(255) = 'dbo.table'

    DECLARE @SQL NVARCHAR(MAX) = ''

    SET @SQL = @SQL + 
      'INSERT Control.dbo.Consistency_Check
            (Table_Name              
            ,Schema_Name             
            ,Id                      
            ,Incremental_DateTime_Column       
             )
      SELECT
             @Tab 
            ,''ODS''
            ,Id
            ,SystemModstamp
      FROM
            ' + @Obj + ''

    EXEC (@SQL)

答案 2 :(得分:-1)

你做不到。您可能想要使用动态查询。即使用sp_executesql将SQL查询字符串转换为变量和exec。

您可以在动态SQL中使用相同的变量名称,但我将其更改为@p_Tab作为示例。

DECLARE @Tab int = 3 
DECLARE @SQLString nvarchar(500)
DECLARE @ParmDefinition nvarchar(500) = N'@p_Tab int';  
Declare @TableName nvarchar(100) = 'ODS..Account'

/* Build the SQL string dynamicly.*/  
SET @SQLString =  N'INSERT Control.dbo.Consistency_Check
            (Table_Name              
            ,Schema_Name             
            ,Id                      
            ,Incremental_DateTime_Column       
             )
      SELECT
             @p_Tab 
            ,''ODS''
            ,Id
            ,SystemModstamp
      FROM
            '+ @TableName

EXECUTE sp_executesql   @SQLString, @ParmDefinition,
                        @p_Tab = @Tab  

进一步参考:https://msdn.microsoft.com/en-us/library/ms188001.aspx