2015-09-09 2 views
1

Я ищу для резервного копирования таблицы и автоматического добавления даты в конец имени таблицы.Таблица резервного копирования SQL Server EXEC с датой динамически

Вот что у меня есть

declare @table char(36)= 'template_fields' 

EXEC('select * into '[email protected]+'_'+'convert(date, getdate()) from '[email protected]) 

И я хочу, чтобы конечный результат выглядеть как

template_fields_09-09-2015 

Что я здесь отсутствует?

ответ

0

Просто распечатайте, что вы делаете:

DECLARE @table NVARCHAR(MAX) = 'tab'; 

DECLARE @sql NVARCHAR(MAX) = 'select * into '[email protected]+'_' 
    +'convert(date, getdate()) from '[email protected]; 

SELECT @sql; 

вы получите: select * into tab_convert(date, getdate()) from tab

Вам необходимо пройти дату с именем таблицы, как:

SqlFiddleDemo

DECLARE @table NVARCHAR(MAX) = 'tab'; 
DECLARE @new_table NVARCHAR(MAX) = @table + '_' + 
            CONVERT(NVARCHAR(100), GETDATE(),105); 

DECLARE @sql NVARCHAR(MAX) = 'select * into ' + @new_table + ' from '+ @table; 

SELECT @sql; 
/* Result select * into tab_09-09-2015 from tab */ 
-- EXEC(@sql); 
0

Первый из всех l, не используйте EXEC для запуска динамических запросов, вместо этого используйте sp_executesql. Во-вторых: если вы хотите построить SQL-запрос с именами переменных объектов, используйте QUOTENAME().

DECLARE @table sys.sysname = 'mytable' 
DECLARE @backup sys.sysname = @table + '_' + CONVERT(date, GETDATE()); 
DECLARE @sql NVARCHAR(MAX) = 'SELECT * INTO ' 
    + QUOTENAME(@backup) + ' ' 
    + FROM + ' ' 
    + QUOTENAME(@table); 

EXEC sp_executesql 
    @stmt = @sql 

Пожалуйста, обратите внимание, что, то sys.sysname встроенный тип данных (по существу псевдоним для NVARCHAR(128) NOT NULL) и SQL Server использует его для внутренних имен объектов.

Примечание: У меня нет экземпляра SQL Server, доступного прямо сейчас, поэтому приведенный выше запрос может содержать опечатки.

0

В итоге я решил это самостоятельно. В то время как некоторые хорошие ответы были добавлены, я написал свой первоначальный запрос более просто, чтобы достичь этого. Спасибо всем за помощь.

--Declare and initiate the table 
    declare @table varchar(36)= 'template_fields' 
--Declare and initiate the date (YYYYMMDD) without dashes 
    declare @date varchar(10) = convert(int, convert(varchar(10), getdate(), 112)) 

--Execute the query with the variables resulting in a new table titled 'template_fields_20150909' 
    EXEC('select * into '[email protected]+'_'[email protected]+' from '[email protected]) 
Смежные вопросы