SQL 服务器:如何始终查询名称中包含当前日期的 table

SQL Server : how to always query a table that has the current date in it's name

我使用的数据库总是创建一个名为 Table_Name_YYYYMMDD 的报告 table。

我想创建一个使用如下子查询的查询:

Select convert(varchar, getdate(), 112)

可以让我始终从 table 获取名称中包含当前日期的结果。

用户对数据库具有只读访问权限。

我确实尝试了以下方法:

Declare @Tname varchar(50); 
Set @Tname = 'table_name_' + (Select convert(varchar, getdate(), 112));

Declare @Q varchar(200);
Set @Q = 'Select * From ' + @Tname;

Exec @Q;

但是我得到一个错误:

Must declare the scalar variable "@Q".

谢谢!

使用 table 名称本身来存储临时信息并不是最佳做法。最好只维护一个 单个 报告 table,然后为报告日期添加一个 timestamp/datetime 列(以及某种主键).

然后,如果您想select所有与今天的报告有关的记录,您可以使用:

SELECT *
FROM ReportTable
WHERE dt = GETDATE();  -- or something similar to this

首先,Exec @Q是调用存储过程的语法。 使用

Exec (@Q);

执行语句。

你的问题不是很清楚... 您似乎知道,使用 value-named table 名称的方法很糟糕。但是您告诉我们,您必须坚持使用这个 third-party 工具。好吧,狗屎发生了;-)

您的代码应该可以工作,但假设您没有显示所有内容 and/or 您为了简洁起见试图缩短代码(这很棒!),但是 - 也许 - 您缩短了错误...

试试这个:

USE master;
GO
CREATE DATABASE testTbWithDate; --Some extra database to create tables
GO
USE testTbWithDate;
GO
CREATE TABLE SomeName_20190701(ID INT,SomeValue VARCHAR(100));
GO
CREATE TABLE SomeName_20190630(ID INT,SomeValue VARCHAR(100));
GO
--test values
INSERT INTO SomeName_20190630 VALUES(1,'this is 30th of June'); 
INSERT INTO SomeName_20190701 VALUES(1,'this is 1st of July');
GO

--此处开始查询

--You should always use (n)varchar together with a length parameter
--And you should not keep your length to small...
Declare @Tname varchar(50) =  --<-- 50 might be not enough...
   'SomeName_' + (Select convert(varchar(8), {d'2019-07-01'}, 112)); --I added "(8)"


Declare @Q varchar(max); --This was pretty small, I use "(max)"
Set @Q = 'Select * From ' + QUOTENAME(@Tname); --I use QOUTENAME to avoid invalid names and help (a little bit) against SQL injection

PRINT @Q; --always print out your command. Now you can copy and paste it into a query window and check the syntax.
Exec(@Q); --the execution

--Clean-Up

GO
USE master;
GO
DROP DATABASE testTbWithDate;