【问题标题】:Difficulties Selecting from a Local Variable Using a Another Local Variable in the Where Clause在 Where 子句中使用另一个局部变量从局部变量中选择的困难
【发布时间】:2019-09-12 16:26:58
【问题描述】:

我正在尝试查找要更新的最新表格。服务器中的大多数表都有一个名为“lastmodified”之类的列。

我在这方面的方法是尝试选择所有表名(以及相应的列名,如'%lastmodified%')并通过循环运行它们。

该循环旨在从每个表中选择最大的 lastmodified 日期。

我一直在玩 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

没有 Execute 行:“必须声明变量 @tablename” 使用 EXEC 行时,我得到一个语法错误,并且 EXEC 之前的等号被突出显示。

【问题讨论】:

  • set @datein = EXEC(..) 语法错误。你想在这条线上做什么?看sp_executesqldocs.microsoft.com/en-us/sql/relational-databases/…
  • 我正在尝试为每个表名选择最大上次编辑日期并将其存储在@datein 中。我的目标是为临时表添加为每一行添加的最大上次修改日期。

标签: sql sql-server dynamic-sql


【解决方案1】:

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

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

【讨论】:

  • 这正是我想要的 - 谢谢!
猜你喜欢
  • 2017-12-22
  • 2011-04-15
  • 2010-11-17
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多