Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как обратиться к временной таблице?  [new]
Prg_Alex_
Member

Откуда: Москва
Сообщений: 54
Требуется из временной таблицы выгрузить данные в текстовый файл с помощью bcp.

DECLARE @strSQL VARCHAR(1000)
....
IF ( ISNULL( OBJECT_ID( 'tempdb..#tmpErr' ) , 0) > 0 ) DROP TABLE #tmpErr
SELECT NumErr,
           cErrMes
   INTO #tmpErr
  FROM tbl_Errors

SET @strSQL = 'bcp " SELECT * FROM tempdb..#tmpErr" queryout F:\1$\results.txt   -c -t, -C RAW, -r \n -T'
EXEC @result=master..xp_cmdshell @strSQL
IF @result=0 
    PRINT 'скопировано'
ELSE
    PRINT 'ошибка'


Имеем следующее:
Warning = [Microsoft][SQL Server Native Client 10.0][SQL Server]Имя базы данных "tempdb" пропущено, обращение к объекту в tempdb.
SQLState = 01000, NativeError = 2701
Warning = [Microsoft][SQL Server Native Client 10.0][SQL Server]Имя базы данных "tempdb" пропущено, обращение к объекту в tempdb.
SQLState = S0002, NativeError = 208
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Недопустимое имя объекта "#tmpErr".
SQLState = 37000, NativeError = 8180
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Не удалось выполнить подготовку инструкций.

Если таблица не временная, то работает без ошибок. Выгружает в текстовик все как было задумано.
Подскажите, как правильно обратиться к таблице. Заранее благодарю за ответы.
5 мар 14, 10:49    [15674766]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
глобальную временную создай
5 мар 14, 10:50    [15674784]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prg_Alex_
Подскажите, как правильно обратиться к таблице.

1. Невозвожно обращаться к временным таблицам другого коннекта.
2. Ваша bcp выполняется в другом коннекте.
5 мар 14, 10:53    [15674810]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Дедушка Ау
Guest
Prg_Alex_,

Так Вы же её дропнули и сразу что-то в несуществующий объект что-то пихаете ....
5 мар 14, 10:53    [15674812]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Prg_Alex_
Member

Откуда: Москва
Сообщений: 54
Дедушка Ау,

SELECT ... INTO #tmpErr
5 мар 14, 10:56    [15674842]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Prg_Alex_
Member

Откуда: Москва
Сообщений: 54
Glory,
Правильно ли я понял, что из времянки таким способом выгрузить не удастся?
5 мар 14, 10:58    [15674858]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prg_Alex_
Glory,
Правильно ли я понял, что из времянки таким способом выгрузить не удастся?

Причем тут выгрузить ?
Главная фраза " в другом коннекте нельзя обратится в локальной временной таблице"
А в том же самом коннекте - можно
5 мар 14, 11:00    [15674879]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Prg_Alex_
Member

Откуда: Москва
Сообщений: 54
Спасибо, вопрос решился созданием ..INTO ##tmpErr..
УРА!
5 мар 14, 11:01    [15674883]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prg_Alex_
Спасибо, вопрос решился созданием ..INTO ##tmpErr..
УРА!

И как это будет работать для нескольких коннектов, вы тоже уже подумали ?
5 мар 14, 11:02    [15674892]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Prg_Alex_
Member

Откуда: Москва
Сообщений: 54
Glory,
прибивать буду сразу таблу.
5 мар 14, 11:09    [15674967]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prg_Alex_
Glory,
прибивать буду сразу таблу.

Сразу - это когда ? Когда какой то из коннектов ее заполняет ? Или когда уже запустил bcp ?
5 мар 14, 11:11    [15674988]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Prg_Alex_
Glory,
прибивать буду сразу таблу.

таблок повесь на таблицу при запуске bcp
5 мар 14, 11:20    [15675070]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Prg_Alex_
Member

Откуда: Москва
Сообщений: 54
Glory,
После выполнения bcp.
Ситуация когда другой коннект будет менять временную таблу - крайне маловероятен.
5 мар 14, 11:23    [15675093]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prg_Alex_
Glory,
После выполнения bcp.
Ситуация когда другой коннект будет менять временную таблу - крайне маловероятен.

Вы точно понимаете ситуацию ?
1ый коннект
- удаляет таблицу
- создает ее
- выгружет

и в этот момент 2ой коннект начинает выполнение. А с чего он начинает выполнение ? Правильно, с удаления таблицы, которая используется в 1ом коннекте

Все радуются.
5 мар 14, 11:26    [15675132]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Дались вам это временные таблицы...
Сделайте нормальную, разруливайте данные по @@spid и будет вам счастье!
Или данные сильно различаются раз от раза?
5 мар 14, 11:31    [15675188]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Хотел сказать структура таблицы различается
5 мар 14, 11:31    [15675196]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Prg_Alex_
Member

Откуда: Москва
Сообщений: 54
Glory,
Да, теперь понял суть проблемы. Спасибо. Буду думать как выгрузить другим способом.

Я собирался это в джобе крутить раз в сутки, вряд ли какой другой коннект будет запускать этот код. Но, если найду другой способ выгрузки, то обязательно перепишу.

Еще раз, благодарю.
5 мар 14, 11:32    [15675209]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
SQL2008
Дались вам это временные таблицы...
Сделайте нормальную, разруливайте данные по @@spid и будет вам счастье!
Или данные сильно различаются раз от раза?

spid у создающего таблицу и у бцп - разный будет :)
5 мар 14, 12:08    [15675679]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Glory
Prg_Alex_
Glory,
После выполнения bcp.
Ситуация когда другой коннект будет менять временную таблу - крайне маловероятен.

Вы точно понимаете ситуацию ?
1ый коннект
- удаляет таблицу
- создает ее
- выгружет

и в этот момент 2ой коннект начинает выполнение. А с чего он начинает выполнение ? Правильно, с удаления таблицы, которая используется в 1ом коннекте

Все радуются.

можно легко и просто сделать так.
Удалять не в начале, а в конце выгрузки.
То есть если таблица есть - не дропать, а ничего не делать и ждать (пока выгрузка в другом конекте не закочится и он ее не дропнет).
5 мар 14, 12:10    [15675708]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ivan Durak
можно легко и просто сделать так.
Удалять не в начале, а в конце выгрузки.
То есть если таблица есть - не дропать, а ничего не делать и ждать (пока выгрузка в другом конекте не закочится и он ее не дропнет).

А своими данными заполнять прямо поверх существующих, да ?
5 мар 14, 12:12    [15675736]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Ivan Durak
Glory
пропущено...

Вы точно понимаете ситуацию ?
1ый коннект
- удаляет таблицу
- создает ее
- выгружет

и в этот момент 2ой коннект начинает выполнение. А с чего он начинает выполнение ? Правильно, с удаления таблицы, которая используется в 1ом коннекте

Все радуются.

можно легко и просто сделать так.
Удалять не в начале, а в конце выгрузки.
То есть если таблица есть - не дропать, а ничего не делать и ждать (пока выгрузка в другом конекте не закочится и он ее не дропнет).


Тогда уже в сторона applock посмотреть
5 мар 14, 12:14    [15675759]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Ivan Durak
SQL2008
Дались вам это временные таблицы...
Сделайте нормальную, разруливайте данные по @@spid и будет вам счастье!
Или данные сильно различаются раз от раза?

spid у создающего таблицу и у бцп - разный будет :)

Вы правы... Я про динамический запрос забыл. Подумал, что можно будет обойтись работой в одном коннекте.
5 мар 14, 12:16    [15675784]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
someonesomehow
Guest
к имени глобальной временной таблицы добавлять гуид?
5 мар 14, 12:17    [15675798]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
Glory
Member

Откуда:
Сообщений: 104751
someonesomehow
к имени глобальной временной таблицы добавлять гуид?

А еще можно просто сразу в вызове bcp написать нужный запрос
5 мар 14, 12:21    [15675844]     Ответить | Цитировать Сообщить модератору
 Re: Как обратиться к временной таблице?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Ivan Durak
spid у создающего таблицу и у бцп - разный будет :)

Ну тогда как-то так
DECLARE @strSQL VARCHAR(1000)
DECLARE @spid int = @@spid;
....
DELETE FROM tmpErr WHERE [spid] = @spid;
INSERT INTO tmpErr
SELECT NumErr,
           cErrMes,
           @spid as [spid]
FROM tbl_Errors

SET @strSQL = 'bcp " SELECT * FROM tmpErr" WHERE [spid] = ' + CAST(@spid as NVARCHAR(16) + '  queryout F:\1$\results.txt   -c -t, -C RAW, -r \n -T'
EXEC @result=master..xp_cmdshell @strSQL
IF @result=0 
    PRINT 'скопировано'
ELSE
    PRINT 'ошибка'

DELETE FROM tmpErr WHERE [spid] = @spid;
5 мар 14, 12:37    [15676054]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить