如何以动态的方式从表中选择表名?

时间:2011-12-26 14:29:24

标签: sql sql-server sql-server-2005

我想从表格本身中选择表格名称

例如

Select * ,(TableName) from Table1

union

Select *,(TableName) from Table2

我不想以静态的方式做这件事

Select * ,'TableName' as tbl from Table1

union

Select *,'TableName'  as tbl from Table2

提前致谢

2 个答案:

答案 0 :(得分:1)

你做不到。

您可以使用SELECT OBJECT_NAME(this)之类的元数据功能。

FROM Table1位是静态的,所以问题是什么呢?

答案 1 :(得分:1)

解决方案可以是动态的,但它比你的第一个代码块复杂得多。

声明一个足够大的varchar变量来保存你的select脚本(例如@script)。 声明一个游标,用于迭代sysobjects表中的表。它类似于:

declare cc cursor for select name from sysobjects 
where type='U' and name like '%yourTableNamePatternHere%'
order by name

使用fetch next和@@ fetch_status在while循环中记录记录,将大型union-query组装成@script,最后使用sp_executesql让服务器执行@script。

就是这样。 以下是一个列表中的脚本:

declare @n varchar(100), @script nvarchar(2000)
set @script = ''

declare cc cursor for select name from sysobjects where type='u' and name like '%yourTableNamePatternHere%'
open cc
fetch next from cc into @n

while @@fetch_status = 0
    begin
    if @script <> '' set @script = @script + ' union '
    set @script = @script + 'select <column1>, <column2>, ''' + @n + ''' as tableName from ' + @n 
    fetch next from cc into @n
    end

close cc
deallocate cc

-- print @script
exec sp_executesql @script