在 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
我正在尝试查找最近更新的 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