2014-12-19 3 views
4

Я пытаюсь переименовать таблицу в SQL Server 2008 R2, используя следующий код:использовать переменную в имени таблицы при переименовании таблицы в SQL

declare @date varchar(8) 
set @date = convert(varchar(8), getdate(), 112) 

exec sp_rename 'LM_SM_Billing_and_Send_Data', '[email protected]' 

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

select convert(varchar(8), getdate(), 112) 

возвращает 20141219

, но когда я запускаю переименовать его именем таблицы;

[email protected] 

вместо вставки даты

Я интересно, если это возможно, чтобы иметь его переименовать;

LM_SM_Billing_and_Send_Data_20141219 

с использованием этой переменной в имени таблицы.

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

+2

ты не можешь сделать что-то вроде 'установить @name = 'LM_SM_Billing_and_Send_Data_' + @ date', а затем' Exec sp_rename 'LM_SM_Billing_and_Send_Data', @ name'? –

+1

SQL не выполняет строковой интерполяции. Кажется, вы думаете, что он заглянет в '' LM_SM_Billing_and_Send_Data_ @ date'' и посмотрит '@ date' и что-то с этим сделаю. Неа. –

ответ

4

Проблема, с которой вы столкнулись здесь, как указал Джон Сондерс в своем комментарии, SQL не будет подставлять значение вашей переменной в ваш параметр. (Строковая интерполяция)

Другая проблема, с которой вы столкнулись при попытке обойти эту проблему, заключается в конкатенации вызова процедуры. Ниже также будет не работа.

exec sp_rename 'LM_SM_Billing_and_Send_Data', 'LM_SM_Billing_and_Send_Data_' + @date

Причина выше будет также ошибка, происходит потому, что параметр может быть либо переменной или константой, а не выражением, как выше приведено описание. Если мы объявим @myNewName и задаем требуемое значение в этой переменной, мы можем передать это процедуре.

Дайте этому попытку:

declare @date varchar(8) 
set @date = convert(varchar(8), getdate(), 112) 

declare @myNewName varchar(255) = 'LM_SM_Billing_and_Send_Data_' + @date 

exec sp_rename 'LM_SM_Billing_and_Send_Data', @myNewName 

Это может быть хорошим справочником, как один продолжает работать с параметрами SQL: http://msdn.microsoft.com/en-us/library/ms189260(v=sql.105).aspx

+0

Это отлично сработало для переименования, THANKYOU. позже в сценарии я хочу отбросить таблицу, которую я переименовал с датой, но выпадающая таблица @myNewName завершилась неудачно, ошибка «ожидает»., ID или QUOTED_ID. Есть идеи? – Sadie

+0

@Ben Хорошая точка. Добавлена ​​дополнительная информация. – Dan

+0

@Sadie Ссылка в конце этого комментария может касаться вашей новой проблемы, если нет, я бы предложил искать динамический sql и «t-sql drop variable variable name». http://dba.stackexchange.com/questions/39627/how-to-drop-tables-using-a-variable-in-sql-server – Dan

0

Использование Dynamic Sql для добавления переменной на новое имя таблицы.

Используйте синтаксис select * into для копирования данных из новой старой таблицы в новую таблицу, эта часть должна выполняться динамически.

Тогда, наконец, удалить старую таблицу

declare @date varchar(8), 
set @date = convert(varchar(8), getdate(), 112) 


set @sql ='select * into LM_SM_Billing_and_Send_Data_'[email protected]+' 
      from LM_SM_Billing_and_Send_Data' 

exec sp_executesql @sql 

Drop table LM_SM_Billing_and_Send_Data 
Смежные вопросы