Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема с ALTER TABLE  [new]
Durex_
Member

Откуда:
Сообщений: 79
Написал такую процедуру.
ALTER PROCEDURE test
AS 
BEGIN
BEGIN TRY

--Изменяем  тип поля дата на DATE
ALTER TABLE Export ALTER COLUMN [Дата] DATE

-- Добавляем поле для сверки суммы
ALTER TABLE Export add [Сумма] FLOAT

-- Заполняем данными из месяц/год
UPDATE Export
      SET [Дата]=CAST([Год] AS VARCHAR)+CASE WHEN [Месяц]<10 THEN '0'+CAST([Месяц] AS VARCHAR) ELSE CAST([Месяц] AS VARCHAR) END+'01'
   FROM [dbo].[Export] 

--Проставляем сумму в соответствии со справочником
UPDATE Export
      SET [Сумма] = Pricelist.Price * Export.Упаковки
   FROM Export LEFT JOIN PriceList ON Export.[Номенклатура] = PriceList.SKU

-- Удаляем лишние поля 
ALTER TABLE Export DROP COLUMN [Год],[Месяц],[Квартал]
END TRY
BEGIN CATCH
insert into Log_errors (Number,Severity,[state],[Procedure],Line,[Message])
  SELECT
     ERROR_NUMBER() AS ErrorNumber
    ,ERROR_SEVERITY() AS ErrorSeverity
    ,ERROR_STATE() AS ErrorState
    ,ERROR_PROCEDURE() AS ErrorProcedure
    ,ERROR_LINE() AS ErrorLine
    ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
End


1) при выполнении ошибка: Msg 207, Level 16, State 1, Procedure test, Line 19
Invalid column name 'Сумма'.

Подскажите что я делаю не так?

2)И блок CATCH не отрабатывает. Не попадает ошибка в журнал.
Это второстепенный вопрос, но все равно интересно почему.

Заранее благодарю за ответы.
23 июн 14, 18:18    [16208404]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с ALTER TABLE  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
На момент компиляции колонка "сумма" не существует. А почему такой плохой формат для хранения денег?

CATCH ловит не все ошибки, читайте справку.
23 июн 14, 18:22    [16208425]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с ALTER TABLE  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
Хотя, компилировать он должен. Если говорит, что инвалид, значит не находит.
23 июн 14, 18:24    [16208436]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с ALTER TABLE  [new]
Durex_
Member

Откуда:
Сообщений: 79
Деньги в таком формате переносится мастером импорта фалов из таблицы Excel. Я в процедуре указал такой же. Можно указать и Money ну или SmallMoney, но все равно что-то не выходит.
23 июн 14, 18:25    [16208446]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с ALTER TABLE  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4894
Durex_
Деньги в таком формате переносится мастером импорта фалов из таблицы Excel. Я в процедуре указал такой же. Можно указать и Money ну или SmallMoney, но все равно что-то не выходит.


Оберните ваши команды EXEC (' .. ')
23 июн 14, 18:35    [16208487]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с ALTER TABLE  [new]
Durex_
Member

Откуда:
Сообщений: 79
>Оберните ваши команды EXEC (' .. ')

Alter PROCEDURE test
AS 
BEGIN
BEGIN TRY
DECLARE @CmdStr varchar(1000)
SET @CmdStr = 'ALTER TABLE Export add [Сумма] Money'

--Изменяем  тип поля дата на DATE
ALTER TABLE Export ALTER COLUMN [Дата] DATE

-- Добавляем поле для сверки суммы
EXEC @CmdStr

SET @CmdStr = 'UPDATE Export
      SET [Дата]=CAST([Год] AS VARCHAR)+CASE WHEN [Месяц]<10 THEN ''0''+CAST([Месяц] AS VARCHAR) ELSE CAST([Месяц] AS VARCHAR) END+''01''
   FROM [dbo].[Export]'
-- Заполняем данными из месяц/год
Exec @CmdStr

--Проставляем сумму в соответствии со справочником
SEt @CmdStr = 'UPDATE Export
      SET [Сумма] = Pricelist.Price * Export.Упаковки
   FROM Export LEFT JOIN PriceList ON Export.[Номенклатура] = PriceList.SKU'

Exec @CmdStr 

-- Удаляем лишние поля 
ALTER TABLE Export DROP COLUMN [Год],[Месяц],[Квартал]
END TRY
BEGIN CATCH
INSERT INTO Log_errors (Number,Severity,[state],[Procedure],Line,[Message])
  SELECT
     ERROR_NUMBER() AS ErrorNumber
    ,ERROR_SEVERITY() AS ErrorSeverity
    ,ERROR_STATE() AS ErrorState
    ,ERROR_PROCEDURE() AS ErrorProcedure
    ,ERROR_LINE() AS ErrorLine
    ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
End


Ура! В Log_errors стали попадать записи с ошибками. Но чтобы они значили?

The name 'ALTER TABLE Export add [Сумма] Money' is not a valid identifier.

И все равно не работает (
23 июн 14, 18:45    [16208525]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с ALTER TABLE  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Durex_,

EXEC @CmdStr
и
EXEC ( @CmdStr )

это разные команды.
23 июн 14, 19:02    [16208591]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с ALTER TABLE  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
Durex_
>Оберните ваши команды EXEC (' .. ')


Ура!
И все равно не работает (



вы решили проблемы или нет?
24 июн 14, 08:53    [16209900]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с ALTER TABLE  [new]
Durex_
Member

Откуда:
Сообщений: 79
yaxta
Durex_
>Оберните ваши команды EXEC (' .. ')


Ура!
И все равно не работает (



вы решили проблемы или нет?



Да, спасибо! Решил. Действительно не хватало скобок в EXEC.

В чем разница со скобками и без - все равно не понял. Впрочем, почему изменение типа у столбца выполнялось безо всяких EXEC, а добавление потребовало таких изменений - тоже не понял.
24 июн 14, 09:34    [16210020]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с ALTER TABLE  [new]
DKasimov
Member

Откуда: Москва
Сообщений: 63
Durex_,

Пакеты.
Одно из решений динамичный скуль.
24 июн 14, 13:41    [16211576]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с ALTER TABLE  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Durex_
В чем разница со скобками и без - все равно не понял.
Со скобками - выполнение динамическрго SQL, без - выполнение хранимой процедуры. Разницу улавливаете?
Durex_
Впрочем, почему изменение типа у столбца выполнялось безо всяких EXEC, а добавление потребовало таких изменений - тоже не понял.
Потому что у вас alter и update в одном пакете и на момент его компиляции нужного столбца в таблице еще нет. А exec('...') - это уже другой пакет, который компилируется и выполняется в рантайме, когда столбец в таблице уже есть.
24 июн 14, 14:11    [16211751]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить