我声明了一个变量@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 )
答案 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