Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Exec ХП. Обращение к runtime полю  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1832
Добрый день.
Код ниже выполняется:
CREATE TABLE #tmpImport (a INT)
SELECT tmp.a FROM #tmpImport tmp
ALTER TABLE #tmpImport ADD b INT
SELECT tmp.a, tmp.b FROM #tmpImport tmp
DROP TABLE #tmpImport

Теперь создаем ХП:
CREATE PROCEDURE [dbo].[_temp] 
AS
BEGIN

  SET NOCOUNT ON;

  SELECT tmp.a FROM #tmpImport tmp
  
  ALTER TABLE #tmpImport ADD b INT
  
  SELECT tmp.a, tmp.b FROM #tmpImport tmp
  
END

Код ниже не выполняется:
CREATE TABLE #tmpImport (a INT)
EXEC _temp
DROP TABLE #tmpImport

Invalid column name 'b'.
Есть ли опция которая разрешит выполнение без предварительной проверки?
6 янв 15, 11:29    [17088686]     Ответить | Цитировать Сообщить модератору
 Re: Exec ХП. Обращение к runtime полю  [new]
Glory
Member

Откуда:
Сообщений: 104751
X-Cite
Есть ли опция которая разрешит выполнение без предварительной проверки?

Дело не в предварительной проверке.
Дело в том, что в одном пакете нельзя изменять структуру таблицы и обращаться к вновь добавленным полям.
А в разных пакетах - можно.
6 янв 15, 11:32    [17088694]     Ответить | Цитировать Сообщить модератору
 Re: Exec ХП. Обращение к runtime полю  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1832
Glory
X-Cite
Есть ли опция которая разрешит выполнение без предварительной проверки?

Дело не в предварительной проверке.
Дело в том, что в одном пакете нельзя изменять структуру таблицы и обращаться к вновь добавленным полям.
А в разных пакетах - можно.

т.е. обойти это красиво не получится.
Вариант ниже убог...
ALTER PROCEDURE [dbo].[_temp] 
AS
BEGIN
  EXEC('SELECT tmp.a FROM #tmpImport tmp
           ALTER TABLE #tmpImport ADD b INT')
  EXEC('SELECT tmp.a, tmp.b FROM #tmpImport tmp')
END

Единственный выход это создание новой временной таблицы дублирующей базовую но уже с новым полем и копированием данных туда.
6 янв 15, 12:12    [17088800]     Ответить | Цитировать Сообщить модератору
 Re: Exec ХП. Обращение к runtime полю  [new]
Glory
Member

Откуда:
Сообщений: 104751
X-Cite
т.е. обойти это красиво не получится.

Создавайте сразу таблицу нужной структуры. Тем более временную
6 янв 15, 12:14    [17088807]     Ответить | Цитировать Сообщить модератору
 Re: Exec ХП. Обращение к runtime полю  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1832
Glory
X-Cite
т.е. обойти это красиво не получится.

Создавайте сразу таблицу нужной структуры. Тем более временную

Если бы.
Таблица создается общим компонентом (на клиенте), потом заполняется, и для этого компонента указывается какую ХП вызвать.
Компонент общий для многих сущностей. Также компонент удаляет ее после вызова ХП.
т.е. в разных ХП будет использоваться временная таблица созданная одним компонентом.
Этот компонент может только изменить название таблицы, чтобы она не пересекалась в ХП и переназвать основные поля, но он ничего не знает о дополнительных полях.
Но в каждой ХП своя логика: какие поля могут еще понадобится для временных вычислений и клиент о них ничего не знает.
Т.к. в таблицу может лечь к примеру свыше 1 Гб данных не хотелось бы их дублировать в другой временной таблице с уже нужными полями.
6 янв 15, 12:31    [17088870]     Ответить | Цитировать Сообщить модератору
 Re: Exec ХП. Обращение к runtime полю  [new]
Glory
Member

Откуда:
Сообщений: 104751
X-Cite
Таблица создается общим компонентом (на клиенте), потом заполняется, и для этого компонента указывается какую ХП вызвать.
Компонент общий для многих сущностей. Также компонент удаляет ее после вызова ХП.
т.е. в разных ХП будет использоваться временная таблица созданная одним компонентом.
Этот компонент может только изменить название таблицы, чтобы она не пересекалась в ХП и переназвать основные поля, но он ничего не знает о дополнительных полях.
Но в каждой ХП своя логика: какие поля могут еще понадобится для временных вычислений и клиент о них ничего не знает.
Т.к. в таблицу может лечь к примеру свыше 1 Гб данных не хотелось бы их дублировать в другой временной таблице с уже нужными полями.

И что из этого не позволяет сразу создать таблицу той структуры, что будет нужна для конкретной ХП ?
6 янв 15, 12:34    [17088877]     Ответить | Цитировать Сообщить модератору
 Re: Exec ХП. Обращение к runtime полю  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1832
Glory
X-Cite
Таблица создается общим компонентом (на клиенте), потом заполняется, и для этого компонента указывается какую ХП вызвать.
Компонент общий для многих сущностей. Также компонент удаляет ее после вызова ХП.
т.е. в разных ХП будет использоваться временная таблица созданная одним компонентом.
Этот компонент может только изменить название таблицы, чтобы она не пересекалась в ХП и переназвать основные поля, но он ничего не знает о дополнительных полях.
Но в каждой ХП своя логика: какие поля могут еще понадобится для временных вычислений и клиент о них ничего не знает.
Т.к. в таблицу может лечь к примеру свыше 1 Гб данных не хотелось бы их дублировать в другой временной таблице с уже нужными полями.

И что из этого не позволяет сразу создать таблицу той структуры, что будет нужна для конкретной ХП ?

Компонент предопределен зарание.
В нем можно указать: Создай, пожалуйста временную таблицу с именем #tmpImport и назови поля a, b, c, d, e как aaa, bbb, ccc, ddd, eee. Потом вызови ХП с именем spspspspsp и после выполнения удали #tmpImport. Создавать другие поля он не может.
6 янв 15, 12:40    [17088899]     Ответить | Цитировать Сообщить модератору
 Re: Exec ХП. Обращение к runtime полю  [new]
Glory
Member

Откуда:
Сообщений: 104751
X-Cite
В нем можно указать: Создай, пожалуйста временную таблицу с именем #tmpImport и назови поля a, b, c, d, e как aaa, bbb, ccc, ddd, eee. Потом вызови ХП с именем spspspspsp и после выполнения удали #tmpImport. Создавать другие поля он не может.

Еще раз
Если вы знаете, какую ХП будете вызывать, то что мешает указать этому компоненту создать нужную таблицу ?
6 янв 15, 12:45    [17088909]     Ответить | Цитировать Сообщить модератору
 Re: Exec ХП. Обращение к runtime полю  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1832
Glory
X-Cite
В нем можно указать: Создай, пожалуйста временную таблицу с именем #tmpImport и назови поля a, b, c, d, e как aaa, bbb, ccc, ddd, eee. Потом вызови ХП с именем spspspspsp и после выполнения удали #tmpImport. Создавать другие поля он не может.

Еще раз
Если вы знаете, какую ХП будете вызывать, то что мешает указать этому компоненту создать нужную таблицу ?

MyComponent.TableName := 'tmpImport';
MyComponent.FieldName1 := 'aaa';
MyComponent.FieldName2 := 'bbb';
MyComponent.FieldName3 := 'ccc';
MyComponent.ProcName := 'spspspsp';
MyComponent.CreateTemp();
MyComponent.ExecProc();
MyComponent.DropTemp();
логика создания таблиц и вызова ХП лежит внутри него и не доступна для уровня выше.
6 янв 15, 12:50    [17088920]     Ответить | Цитировать Сообщить модератору
 Re: Exec ХП. Обращение к runtime полю  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1832
X-Cite
Glory
пропущено...

Еще раз
Если вы знаете, какую ХП будете вызывать, то что мешает указать этому компоненту создать нужную таблицу ?

MyComponent.TableName := 'tmpImport';
MyComponent.FieldName1 := 'aaa';
MyComponent.FieldName2 := 'bbb';
MyComponent.FieldName3 := 'ccc';
MyComponent.ProcName := 'spspspsp';
MyComponent.CreateTemp();
MyComponent.ExecProc();
MyComponent.DropTemp();
логика создания таблиц и вызова ХП лежит внутри него и не доступна для уровня выше.

P.S.
FieldName1 - FieldName3 предопределны.. 4-го и далее уже нет свойств.
6 янв 15, 12:51    [17088922]     Ответить | Цитировать Сообщить модератору
 Re: Exec ХП. Обращение к runtime полю  [new]
invm
Member

Откуда: Москва
Сообщений: 9722
X-Cite
Вариант ниже убог...
ALTER PROCEDURE [dbo].[_temp] 
AS
BEGIN
  EXEC('SELECT tmp.a FROM #tmpImport tmp
           ALTER TABLE #tmpImport ADD b INT')
  EXEC('SELECT tmp.a, tmp.b FROM #tmpImport tmp')
END
Можете переписать как
CREATE PROCEDURE [dbo].[_temp2] 
AS
BEGIN
  SELECT tmp.a FROM #tmpImport tmp
  SELECT tmp.a, tmp.b FROM #tmpImport tmp
END
GO

CREATE PROCEDURE [dbo].[_temp] 
AS
BEGIN
  ALTER TABLE #tmpImport ADD b INT
  EXEC [dbo].[_temp2]
END
GO
Результат будет такой же, но без динамики.
6 янв 15, 13:10    [17088967]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить