
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
27.11.2002, 12:19:47
|
|||
|---|---|---|---|
|
|||
Вопрос по local temporary table |
|||
|
#18+
Доброго дня , В хранимой проц P1 создается local temporary table #my_table . Внутри хр. процедуры P1 вызывается другая хр. процедура P2 . Можно ли в P2 производить вставку записей в #my_table , а затем в P1 прочитать модифицированную #my_table ? Т.е. речь идет о передаче данных в виде таблиц между хр. процедурами . Я так понимаю , для этого можно (удобней) использовать только локальные временные таблицы . Заранее благодарен за ответ . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.11.2002, 12:31:26
|
|||
|---|---|---|---|
Вопрос по local temporary table |
|||
|
#18+
Можно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.11.2002, 12:47:28
|
|||
|---|---|---|---|
|
|||
Вопрос по local temporary table |
|||
|
#18+
А пропробуй глобальную ##myTab ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.11.2002, 12:57:36
|
|||
|---|---|---|---|
Вопрос по local temporary table |
|||
|
#18+
2Andrew_azz Не пробуй глобальную ##myTab. Описанный тобой метод самый правильный для сложных обработок на сервере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.11.2002, 13:08:18
|
|||
|---|---|---|---|
Вопрос по local temporary table |
|||
|
#18+
Вообще с этим непонятки: Выдержка из BOL 1: The two types of temporary tables, local and global, differ from each other in their names, their visibility, and their availability. Local temporary tables have a single number sign (#) as the first character of their names; they are visible only to the current connection for the user; and they are deleted when the user disconnects from instances of Microsoft® SQL Server™ 2000. Global temporary tables have two number signs (##) as the first characters of their names; they are visible to any user after they are created; and they are deleted when all users referencing the table disconnect from SQL Server. Выдержка из BOL 2: A local temporary table created in a stored procedure is dropped automatically when the stored procedure completes. The table can be referenced by any nested stored procedures executed by the stored procedure that created the table. The table cannot be referenced by the process which called the stored procedure that created the table. All other local temporary tables are dropped automatically at the end of the current session. Global temporary tables are automatically dropped when the session that created the table ends and all other tasks have stopped referencing them. The association between a task and a table is maintained only for the life of a single Transact-SQL statement. This means that a global temporary table is dropped at the completion of the last Transact-SQL statement that was actively referencing the table when the creating session ended. Вы можете работать с временной таблицей, созданной в верхней процедуре во вложенных процедурах, но не наоборот.. У меня была другая проблема - хп1 вызывала другую хп1, где создавалась и заполнялась временная таблица , управления возвращалось в хп1, потом (после нескольких statetment'ов) хп1 вызывала снова вызывала хп2, где эта временная таблица апдейтилась. В этом случае мне пришлось использовать глобальную временную таблицу. Может как можно использовать локальную временную таблицу (глобальная не есть хорошо)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.11.2002, 15:47:22
|
|||
|---|---|---|---|
Вопрос по local temporary table |
|||
|
#18+
2Makc А какие конкретно непонятки? Действительно, БОЛ не врёт, вы можете работать с временной таблицей, созданной в верхней процедуре во вложенных процедурах, но не наоборот. А в описанном вами случае, действительно, нужно использовать гл. врем таблицу, хотя это не есть хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.11.2002, 16:11:16
|
|||
|---|---|---|---|
|
|||
Вопрос по local temporary table |
|||
|
#18+
>Makc В данной ситауции никак. Только если. 1. В проц2 создается и заполняется временная таблица. 2. Результат управление передается в проц1 3. Результат из проц2 пихается во временную таблицу табл1, которая создается в проц1 4. Вызывается проц2, которая работает с временной таблицей талб1 5. В проц2 апдейтится значения в табл1 Если только таким способом. А глобальная А если у тебя 2 пользователя запустят эту процедуру - в результате получишь неправильные данные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.11.2002, 16:35:54
|
|||
|---|---|---|---|
Вопрос по local temporary table |
|||
|
#18+
2 alexeyvg: Непонятки в этом: 1. they are visible only to the current connection for the user; and they are deleted when the user disconnects from instances of Microsoft® SQL Server™ 2000. 2. A local temporary table created in a stored procedure is dropped automatically when the stored procedure completes. Пункты 1 и 2 разнесены по разным разделам BOL, я лично не сразу, пункт 2 можно просто не найти... 2 Белов Владимир: Проц1 - процедура редактирования данных (всех данные редактируются через хп) Проц2 - процедура аудита на основе метаданных и динамического SQL. Так что вызов проц1 из проц2 невозможен, пихать лишний код в процедуры редактирования, тоже не хочется... Что делать, приходится иcпользовать глобальную :((, поскольку перед апдейтом нужно занести старые значения, а после апдейта - проапдейтить новые... Если 2 пользователя запустят процедуру, думаю ничего не произойдет, поскольку временная таблица создается внутри транзакции, перед commit'ом данные заливаются в основную таблицу аудита и таблица убивается, при ошибке траназкция откатывается.. Или я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.11.2002, 18:16:31
|
|||
|---|---|---|---|
Вопрос по local temporary table |
|||
|
#18+
2Makc Аааа... Если #table создана в ХП, то она видима в этой ХП и в вызовах ниже. Если #table создана батчем в коннекте, то она видима в этом коннекте и во всех вызовах ХП из него. Если #table создана батчем в коннекте, и такая-же #table, но с другими полями создана в ХП, то в ХП видима локальная таблица. Правда, это может зависить от версии и сервис-пака MSSQL. Иллюстрации: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.11.2002, 18:20:25
|
|||
|---|---|---|---|
|
|||
Вопрос по local temporary table |
|||
|
#18+
>Makc угу. понятно. то есть, если я правильно понимаю, так как ты все это делаешь в транзакции, то пользователи "ждут", пока завершиться транзакция. Правильно или я не прав ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.11.2002, 18:38:49
|
|||
|---|---|---|---|
Вопрос по local temporary table |
|||
|
#18+
2 Белов Владимир: Да ждут. Возможен третий вариант с генерацией имени глобальной таблицы, во избежание возможных проблем с deadlock' ом. Буду тестрировать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.11.2002, 04:50:02
|
|||
|---|---|---|---|
Вопрос по local temporary table |
|||
|
#18+
можно так.... но это не производительно.... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. лучше создать постаянную таблицу(не временную постоянную ##) добавить туда поле uniqueidentifier и передовать от процы к проце его.... так быстрее... и не пересекаются... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.11.2002, 09:27:45
|
|||
|---|---|---|---|
Вопрос по local temporary table |
|||
|
#18+
Постоянная таблица есть, туда заливаются данные из временной таблицы. Но непосредственно работать с ней - непроизводительно - поскольку записей в ней будет много, а количество запросов на вставку и обновление зависит от числа столбцов по которым ведется аудит... Кусок кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.11.2002, 10:48:14
|
|||
|---|---|---|---|
Вопрос по local temporary table |
|||
|
#18+
Была такая ситуация: В довольно сложную процедуру (время построения плана было существенным, т.е. иногда больше времени выполнения) данные передавались через #t, которая создавалась до вызова этой процы. Соответственно, при вызове план строился заново, т.к. до вызова процедуре о #t ничего не было известно. Сделал обычную t с полем spid = @@SPID, чтоб процессы не путались. Залетало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=46&mobile=1&tid=1818454]: |
0ms |
get settings: |
11ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
84ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 446ms |

| 0 / 0 |
