SQL Server: как всегда запрашивать таблицу с текущей датой в названии - PullRequest
0 голосов
/ 01 июля 2019

Я нахожусь в базе данных, которая всегда создает таблицу отчета с именем Table_Name_YYYYMMDD.

Я хотел бы создать запрос с использованием такого подзапроса, как:

Select convert(varchar, getdate(), 112)

Может позволить мне всегда получать результаты из таблицы с текущей датой в названии.

Пользователь имеет доступ только для чтения к базе данных.

Я попробовал следующее:

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

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

Exec @Q;

Но я получаю ошибку:

Необходимо объявить скалярную переменную "@Q".

Спасибо!

Ответы [ 3 ]

2 голосов
/ 01 июля 2019

Использование самого имени таблицы для хранения кратковременной информации не рекомендуется. Было бы лучше просто сохранить таблицу отчета single , а затем добавить столбец отметки времени / даты / времени для даты отчета (вместе с каким-то первичным ключом).

Затем, если вы хотите выбрать все записи, относящиеся к сегодняшнему отчету, вы можете просто использовать:

SELECT *
FROM ReportTable
WHERE dt = GETDATE();  -- or something similar to this
1 голос
/ 01 июля 2019

Во-первых, Exec @Q - это синтаксис для вызова хранимой процедуры.Используйте

Exec (@Q);

для выполнения оператора.

0 голосов
/ 02 июля 2019

Ваш вопрос не очень понятен ... Похоже, вы знаете, что подход с значениями с именами имен таблиц является плохим.Но вы сказали нам, что вы должны придерживаться этого стороннего инструмента.Ну, дерьмо случается; -)

Ваш код должен работать, но, вероятно, вы не все показываете и / или пытаетесь сократить его для краткости (что здорово!), Но - возможно - вы сократилиошибка исчезла ...

Попробуйте это:

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

- Очистка

GO
USE master;
GO
DROP DATABASE testTbWithDate;
...