在查询结果中显示表名称; SQL Server 2008

时间:2014-09-02 10:37:10

标签: sql sql-server sql-server-2008 tsql

我尝试根据表格标题生成列。

有没有办法在查询结果中显示FROM子句中指定的表名?

由于

4 个答案:

答案 0 :(得分:2)

从评论中看,似乎你有多个表都具有相同的结构和相似的名称这几乎总是数据库设计不佳的标志。您应该有一个表LOAD_UNISTATS_ACCREDITATION,其中包含年份列。

如果您无法更改数据库结构,那么您可以创建一个视图:

create view v_LOAD_UNISTATS_ACCREDITATION as
    select lua.*, 2013 as year
    from LOAD_UNISTATS_2013_ACCREDITATION lua
    union all
    select lua.*, 2012 as year
    from LOAD_UNISTATS_2012_ACCREDITATION lua
    . . .;

但你问题的答案是“不”。没有自动方法在查询中指定表名。而且,原因很简单。查询中的列在SELECT中定义,但表在FROM中定义。查询可以有多个表。可以想象一个函数,例如OBJECT_ID,但是列不是数据库中的第一类对象。

答案 1 :(得分:0)

动态sql方法,你可以传入一个带有表名的参数(假设它总是具有相同的结构,长度)将是这样的:

创建脚本:

create table LOAD_UNISTATS_2013_ACCREDITATION (value1 int, value2 int)

insert into LOAD_UNISTATS_2013_ACCREDITATION (value1, value2)
values (1,2)

动态SQL:

declare @sql nvarchar(200)
declare @tblname nvarchar(50)

set @tblname = 'LOAD_UNISTATS_2013_ACCREDITATION'
set @sql = 'SELECT value1,value2,' + substring(@tblname, 15, 4) 
           + ' as TableName FROM ' + @tblname
execute(@sql)

Demo Sql Fiddle

答案 2 :(得分:0)

此查询..

select
    st.text
from sys.dm_exec_requests as r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
where r.session_id = @@SPID;

..将为您提供当前正在执行的SQL批处理的原始文本。如果它是一个没有连接的简单单查询批处理,或者您遵循严格的命名约定,那么从st.text解析表名应该相对容易。您必须找到一种方法,将上述内容包含在您的实际查询或批处理中,而不会破坏其逻辑。

然而,这是牛仔编码的本质。要做到正确,理解和改变是很困难的。但是,它确实回答了提出的问题。 @Gordon Linoff将年度特定表格分层视图的解决方案是任何专业部署的方法。每年创建一个新表的过程也可以重新创建视图以包含新表。

答案 3 :(得分:0)

我假设您的查询在FROM子句中始终只有一个表。如果是这种情况,我希望下面的代码会有所帮助:

DECLARE @schema sysname = 'dbo';
DECLARE @tbl sysname = 'tbl_xyz';
DECLARE @Sql nvarchar(Max) = ''
DECLARE @Collist nvarchar(max) = ''


SELECT @Collist = @Collist + c.name + char(10) + ','
FROM sys.columns c
    JOIN sys.tables t ON c.object_id = t.object_id
    JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE t.name = @tbl AND s.name = @schema

IF LEN(@Collist) = 0 PRINT 'Table not found'
ELSE
    BEGIN
        SET @Sql = 'SELECT ' + char(10) + @Collist + '''' + @schema + '.' + @tbl + '''' + ' as TableName' +char(10)
            + 'FROM ' + @schema + '.' + @tbl


        PRINT @Sql
    END

EXECUTE sp_ExecuteSql @Sql