我正在尝试编写一个Windows服务,它将发送自动电子邮件。所有需要电子邮件发送的表都有公共列'templateid'和'emailstatus'。我想遍历所有表并获取列名为“templateid”的表。 现在,我有列名为“templateid”的表列表,从每个表中获取电子邮件状态为“false”的数据,并将其保存在临时表中。 如果'table1'有4行数据,临时表应该有4行。在遍历下一个表之后,应该将行集合添加到同一个临时表中。
IF (SELECT object_id('TempDB..#TEMPTABLE')) IS NOT NULL
BEGIN
DROP TABLE #TEMPTABLE
END
CREATE TABLE #TEMPTABLE(
[ID] INTEGER IDENTITY(1,1) NOT NULL,
[TABLE_NAME] VARCHAR(1000)
)
INSERT INTO #TEMPTABLE(TABLE_NAME)
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'TEMPLATEID'
SELECT * FROM #TEMPTABLE
DECLARE @ROWCOUNT INT
SET @ROWCOUNT = (SELECT COUNT(ID) FROM #TEMPTABLE)
DECLARE @I INT
SET @I=1
WHILE(@I<=@ROWCOUNT)
BEGIN
DECLARE @TABLENAME VARCHAR(500)
SELECT @TABLENAME=TABLE_NAME FROM #TEMPTABLE WHERE ID=@I
EXEC('SELECT * FROM '+@TABLENAME)
SET @I=@I+1
END
我发现上面的查询给了我所有的表格。之后我无法继续进行,因为我对sql server不好。
答案 0 :(得分:0)
不确定您是否仍在寻找答案,但以下代码将为您提供一个临时表,其中只包含名为&#39; templateid&#39;的列。从这里你需要一个光标,Tanner建议循环遍历每个表,然后从每个表中插入记录(进入你的最终目标表),其中电子邮件状态=&#39; false&#39;。
以下代码可以为您提供包含名为&#39; templateid&#39;的列的临时表。以及光标的示例:
declare @max_tables int
declare @max_columns int
declare @sql nvarchar(400)
declare @x int
declare @y int
declare @table varchar(50)
declare @columns varchar(800)
declare @tablename varchar(100)
create table #c ([Table] varchar(50),[Columns] varchar(800))
select ROW_NUMBER() OVER(ORDER BY name) AS Row, name
into #table_list
from sys.objects
where type_desc = 'USER_TABLE'
order by name
set @max_tables = (select count(*) from sys.objects where type_desc = 'USER_TABLE')
set @y = 0
while @y < @max_tables
begin
set @y = @y + 1
set @table = (select name from #table_list where row = @y)
create table #t (c int)
set @sql = 'select count(*) as c from Information_schema.Columns where table_name = ''' + @table + ''''
insert into #t exec sp_executesql @sql
set @max_columns = (select top 1 c from #t)
DROP TABLE #t
set @x = 0
set @columns = ''
while @x < @max_columns
begin
set @x = @x + 1
set @columns = @columns + (select column_name from Information_schema.Columns where table_name = @table and ordinal_position = @x)
if @x < @max_columns set @columns = @columns + ', '
end
insert into #c select @table,@columns
end
select * into #tables from #c c
where c.Columns like '%templateid%'
declare my_cursor cursor for
select table from #t
open my_cursor
fetch next from my_cursor into @tablename
while @@fetch_status = 0
begin
--do something here to retrieve your data from each table and
--insert into target table
end
close my_cursor
deallocate my_cursor
DROP TABLE #c,#tables,#table_List