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;
我使用的数据库总是创建一个名为 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;