我尝试根据表格标题生成列。
有没有办法在查询结果中显示FROM子句中指定的表名?
由于
答案 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)
答案 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