Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在查询结果中显示表名;SQL Server 2008_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

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

在查询结果中显示表名;SQL Server 2008,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我正在尝试根据表的标题生成列 有没有办法在查询结果中显示FROM子句中指定的表名 感谢您的评论,您似乎有多个表都具有相同的结构和相似的名称。这几乎总是数据库设计不佳的标志。您应该有一个单独的表格LOAD\u UNISTATS\u ACCREDITATION,其中有一个年度列 如果无法更改数据库结构,则可能可以创建一个视图: create view v_LOAD_UNISTATS_ACCREDITATION as select lua.*, 2013 as year from LO

我正在尝试根据表的标题生成列

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


感谢您的评论,您似乎有多个表都具有相同的结构和相似的名称。这几乎总是数据库设计不佳的标志。您应该有一个单独的表格
LOAD\u UNISTATS\u 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\u ID
,用于此目的,但列不是数据库中的第一类对象。

动态sql方法,您可以使用表名(假设它始终具有相同的结构、长度)传入一个参数,该方法如下所示:

创建脚本:

create table LOAD_UNISTATS_2013_ACCREDITATION (value1 int, value2 int)

insert into LOAD_UNISTATS_2013_ACCREDITATION (value1, value2)
values (1,2)
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)
动态SQL:

create table LOAD_UNISTATS_2013_ACCREDITATION (value1 int, value2 int)

insert into LOAD_UNISTATS_2013_ACCREDITATION (value1, value2)
values (1,2)
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)
此查询

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在特定年份的表上分层视图的解决方案是任何专业部署的方式。每年创建一个新表的过程也可以重新创建视图以包含新表。

我假设您的查询在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

你到底想要什么?从tableHi Jithin中选择*,'table'[源表]。感谢您的回复,我想动态显示表的名称,而无需硬编码。上下文是,我有一组表,其中年份位于表名中,但不包含在数据(!)中的任何位置,因此我尝试在表本身中显示年份。现有的解决方案是硬编码这一年,但我希望找到一种生成它的方法,因为这一练习将在这一年和以后的几年中重复进行。您是否使用动态sql?这可能是最好的选择。如果不是,from子句中的表将来肯定会随着表名而改变吗?您是否只是希望只需更改from子句,并且列名将与之保持一致?请您提供更多信息。请给我们一个表名和预期输出的示例。据我所知,SQL Server/ANSI-SQL中没有这种内置功能。您可能需要动态生成Select语句。但再一次,如果你能提供更多的信息,人们会回答得更好。谢谢大家,戈登,你说得对。恐怕这是一套单独制作一年的表格,但我们正试图将它们设置为一个单独的实体,如您所描述的那样,进行年度比较。谢谢你花时间回复,这给了我一些可以尝试的选择。