在 Where 子句中使用另一个局部变量从局部变量中进​​行选择的困难

Difficulties Selecting from a Local Variable Using a Another Local Variable in the Where Clause

我正在尝试查找最近更新的 table。服务器中的大多数 table 都有一个名为 'lastmodified' 的列。

我的方法是尝试 select 所有 table 名称(以及相应的列名,如 '%lastmodified%')并通过循环 运行 它们。

循环旨在 select 每个 table 的最大最后修改日期。

我一直在研究 EXEC 语句,以便从局部变量 @tablename.

中提取 select 语句
SELECT      c.name columnname
            ,t.name tablename
into #looptemp
FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id
WHERE       c.name LIKE '%lastmodified%'
ORDER BY    TableName
            ,ColumnName

alter table #looptemp add 
ID INT IDENTITY(1,1)

alter table #looptemp add 
lastmod date

declare @run INT
declare @column varchar(1028)
declare @tablename varchar(1028)
declare @datein date

set @run = 1

while (@run <= (select Max(ID) from #looptemp))
Begin

set @column = (Select columnname from #looptemp where ID = @run)
set @tablename =  (select '(''' + tablename + ''')' from #looptemp where ID = @run) 
set @datein = EXEC('SELECT max(@column) FROM ' + @tablename)

update #looptemp set lastmod = @datein

set @run =@run + 1
End

没有执行行:"Must declare the variable @tablename" 对于 EXEC 行,我得到语法错误和等号,然后突出显示 EXEC。

使用sp_executesql。你的逻辑我不太清楚,try

SELECT      c.name columnname
            ,t.name tablename
into #looptemp
FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id
WHERE       c.name LIKE '%lastmodified%'
ORDER BY    TableName
            ,ColumnName

alter table #looptemp add 
ID INT IDENTITY(1,1)

alter table #looptemp add 
lastmod date

declare @run INT
declare @column varchar(1028)
declare @tablename varchar(1028)
declare @datein date

set @run = 1

while (@run <= (select Max(ID) from #looptemp))
Begin

set @column = (Select columnname from #looptemp where ID = @run)
set @tablename =  (select  tablename from #looptemp where ID = @run) 
declare @sql nvarchar(max) = 'SELECT @d = max('+ @column + ') FROM ' + @tablename;
--print @sql
exec sp_executesql @sql, N'@d date out', @d=@datein out;

update #looptemp set lastmod = @datein 
where ID = @run;

set @run =@run + 1
End

Demo