Жизнь переменных!

Danil
Дата: 16.12.2002 07:10:32
Всем привет.
Вопрос такой:
1) Какова "жизнь" перемнных в скрипте на T-SQL. Допустип обявляется переменная и инициализируется определенным значением
declare @IdRep int
set @IdRep=1
Если же в программе встречается GO, то переменную скриптина не "видит", как обойти ентот казус?
2) Создаю глобальную таблицу ##_Group, а после GO, ее невидно...? В чем же дело и как обойти енти проблемы?
Заранее благодарен!
Слон
Дата: 16.12.2002 07:18:49
Ответ простой. GO в скрипте означает начало нового батча. Все что локально для батча, то и будет утрачено после GO. Ищите способ использования постоянных объектов или не используйте GO

-- Слон
Danil
Дата: 16.12.2002 07:25:54
Конечно логически и так понятно, что скрипт разделен на блоки GO, но может существует возможность обявить глобально переменную для всего скрипта? И вот еще вопросик: Когда я создаю таблицу ##_Group путем выгребания из статичной таблицы, то все ограничения теперь присутствуют и в таблице ##_Group? Допустим IDENTITY? Хотя нету никакого IDENTITY на Types.ID от куда выгребаем.
Ошибка такая:
Server: Msg 544, Level 16, State 1, Line 49
Cannot insert explicit value for identity column in table '##_Group' when IDENTITY_INSERT is set to OFF.

Возникает после строчки:
SELECT [ID] FROM ##_Group WHERE [ID]=@Null
IF @@ROWCOUNT = 0 -- Not FOUND
BEGIN
INSERT INTO ##_Group ([ID], [Name]) VALUES (@Null, 'Архивный год/месяц' )
END
SergSuper
Дата: 16.12.2002 10:10:40
1. Пользовательских глобальных переменных не существует.
2. Создавайте временные таблицы не путем выгребания из статичной таблицы, а явно, при помощи конструкции create table ##_Group... и она будет такой, какую Вы хотите. Вы кстати осознано делаете глобальную временную таблицу?
Danil
Дата: 16.12.2002 10:43:15
Делаю осознанно, т.к. если таблица локальная, то в макровызове (через строку) ее не видно! Еще сталкнулся с проблемкой вызываю ХП где создаются глоб. таблица, она отрабатывает и возвращает таблицу (данные).... не закрывая окно в аналайзере.. вызываю ее код в другом окошке аналайзера и пока окошка с ХП не закрою код не завершит своей работы с чем енто может быть связано? Глоб. таблица не уничтожается.. так я ее явно уничтожаю...странно...
Glory
Дата: 16.12.2002 10:52:24
т.к. если таблица локальная, то в макровызове (через строку) ее не видно!
Если под макровызовом имеется ввиду динамический запрос, то

create table #t(f1 int)

select * from #t
exec('insert #t values(1)')
select * from #t


Глоб. таблица не уничтожается.. так я ее явно уничтожаю...странно...

Почитайте в BOL про область видимости и время жизни # и ## таблиц (в описании команды CREATE TABLE)

Когда я создаю таблицу ##_Group путем выгребания из статичной таблицы, то все ограничения теперь присутствуют и в таблице ##_Group? Допустим IDENTITY?

Нет, у временной таблицы будут не все свойства. Но IDENTITY будет.
Danil
Дата: 16.12.2002 13:29:06
Почему же когда в ХП я работаю с созданной локальной временной таблицей, то каждый раз при добавлении к ней записей она очищается? А вот глобальная нет?
Danil
Дата: 16.12.2002 13:31:58
И еще странности какие-то происходят в аналайзере строка execute имя ХП - выводит таблицу с записями, а вот исп-я ADO: RS.Open "Имя ХП",..... получаю чистый рекордсет?
Glory
Дата: 17.12.2002 00:07:02
Почему же когда в ХП я работаю с созданной локальной временной таблицей, то каждый раз при добавлении к ней записей она очищается? А вот глобальная нет?

Еще раз советую почитать в BOL про область видимости и время жизни # и ## таблиц (в описании команды CREATE TABLE) .

И еще странности какие-то происходят в аналайзере строка execute имя ХП - выводит таблицу с записями, а вот исп-я ADO: RS.Open "Имя ХП",..... получаю чистый рекордсет?

Скорее всего в ваше процедуре нет команды SET NOCOUNT ON. Поэтому в ADO вам возвращается несколько recordset-ов