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

Откуда: Владивосток
Сообщений: 62
Здравствуйте. Поиск мне не помог,
SELECT @@VERSION
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)   Nov 24 2008 13:01:59   Copyright (c) 1988-2005 Microsoft Corporation  Workgroup Edition on Windows NT 6.0 (Build 6002: Service Pack 2) 


У меня есть файлы для импорта (в формате csv). Они бывают двух видов. Отличаются количеством столбцов и некоторой не особо полезной информацией. В зависимости от файла я хочу с помощью BULK INSERT загружать их во временную таблицу и определенным образом парсить. Чтобы не плодить однообразный код для разных типов файлов, я хотел сделать, чтобы в зависимости от типа файла создавалась временная таблица нужно структуры. Однако не могу сделать CREATE PROCEDURE, возникает ошибка "В базе данных уже существует объект с именем "#reg"."

Вот минимальный пример, который у меня не работает
CREATE PROCEDURE [dbo].[TEST]
AS
BEGIN
	SET NOCOUNT ON;

	IF OBJECT_ID('tempdb..#reg') IS NULL
		DROP TABLE #reg

	IF @@SPID = 80
		CREATE TABLE #reg(ID INT PRIMARY KEY)
	ELSE
		CREATE TABLE #reg(ID UNIQUEIDENTIFIER PRIMARY KEY)

	IF OBJECT_ID('tempdb..#reg') IS NULL
		DROP TABLE #reg
END

Можно ли как-то "убедить" сервер, что это не повторное создание объекта?
11 дек 12, 02:03    [13610197]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
CREATE TABLE #reg(ID varchar(128) PRIMARY KEY)
11 дек 12, 02:10    [13610204]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
denisofff
Member

Откуда: Владивосток
Сообщений: 62
locky,
вы меня неправильно поняли :-)
у меня две таблицы с разными структурами и разным количество столбцов. Сделать одну универсальную - не получится, так как разный формат файлов для BULK INSERT.
Пример я привел для идентификации ошибки, реально строятся две таблицы, и, в зависимости от типа в них загружаются разные данные. Но дальше идет абсолютно одинаковая обработка (так как обрабатываются только те стоблцы, которые есть и в первом и втором типе файлов).

        IF @TYPE = 'SIMPLE'
	BEGIN
		CREATE TABLE #reg
			(
				SYS_NAME	VARCHAR(20),
				DISTR		INT,
				COMP		TINYINT,
				DIS_TYPE	VARCHAR(20),
				TECH_TYPE	SMALLINT,
				NET			INT,
				SUBHOST		SMALLINT,
				TRANS_COUNT	INT,
				TRANS_LEFT	INT,
				SERVICE		SMALLINT,
				REG_DATE	VARCHAR(20),
				COMMENT		VARCHAR(255),
				COMPLECT	VARCHAR(50)
			)
	END
	ELSE IF @TYPE = 'EX'
	BEGIN
		CREATE TABLE #reg
			(
				SYS_NAME	VARCHAR(20),
				DISTR		INT,
				COMP		TINYINT,
				DIS_TYPE	VARCHAR(20),
				TECH_TYPE	SMALLINT,
				NET			SMALLINT,
				SUBHOST		SMALLINT,
				TRANS_COUNT	SMALLINT,
				TRANS_LEFT	SMALLINT,
				SERVICE		SMALLINT,
				REG_DATE	VARCHAR(20),
				FIRST_REG	VARCHAR(20),
				COMMENT		VARCHAR(255),
				COMPLECT	VARCHAR(50),
				REP_CODE	VARCHAR(10),
				REP_VALUE	VARCHAR(50),
				SYS_SHORT	VARCHAR(10),
				SYS_MAIN	TINYINT
			)
	END


соответственно, нужны только столбцы SYS_NAME, DISTR, COMP, DIS_TYPE, TECH_TYPE, NET, SUBHOST, TRANS_COUNT, TRANS_LEFT, SERVICE, REG_DATE, COMMENT, COMPLECT.
Можно, конечно, делать импорт в таблицы #reg_simple и #reg_ex, соответственно, а потом переливать в #reg и обрабатывать одинаковым образом. Но, хотелось избежать этих лишних телодвижений.
11 дек 12, 02:41    [13610215]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
Crimean
Member

Откуда:
Сообщений: 13148
наверное так правильно?

IF OBJECT_ID('tempdb..#reg') IS NOT NULL
DROP TABLE #reg
11 дек 12, 04:19    [13610246]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
denisofff
Member

Откуда: Владивосток
Сообщений: 62
Crimean, да, Вы абсолютно правы, это я быстро делал маленький тест. Но это не решает проблему. Тут как раз беда, что в разных случаях создать одноименную таблицу разной структуры. Сервер даже не приступает к выполнению запроса, так как возникает ошибка при его разборе. То же самое, если вместо временной таблице использовать табличные переменные. Будет ругаться, что такая переменная уже объявлена.
Ошибка же возникает не во время выполнения, а даже во время CREATE PROCEDURE.
11 дек 12, 04:44    [13610249]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
aleks2
Guest
Через жопу - фсе возможно.

1. Создаешь времянку с фальш-полем. CREATE TABLE #reg(DUMMY char)

2. ALTER TABLE.
11 дек 12, 05:30    [13610259]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
denisofff
Member

Откуда: Владивосток
Сообщений: 62
aleks2, действительно, как это я не догадался.
Учитывая, что десяток первых полей совпадают, можно сделать таблицу и, в зависимости от типа добавить нужных столбцов.
Визуально криво выглядит, но должно работать. Спасибо! Подумаю, так сделать, или более наглядно.
11 дек 12, 05:35    [13610265]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
ALTER PROCEDURE dbo.TEST
AS
BEGIN
	SET NOCOUNT ON;

	IF @@SPID = 80
		exec('CREATE TABLE #reg(ID INT PRIMARY KEY)')
	ELSE
		exec('CREATE TABLE #reg(ID UNIQUEIDENTIFIER PRIMARY KEY)')

	IF OBJECT_ID('tempdb..#reg') IS NOT NULL
		DROP TABLE #reg
END
11 дек 12, 08:06    [13610349]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
HandKot,

Так не получится, созданные таблицы исчезнут сразу после exec()
11 дек 12, 08:21    [13610381]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
точно
пошел посылать голову пеплом
11 дек 12, 08:25    [13610389]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Временная таблица в ХП  [new]
PaulWist
Member

Откуда:
Сообщений: 2231
denisofff
Здравствуйте. Поиск мне не помог,
SELECT @@VERSION
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)   Nov 24 2008 13:01:59   Copyright (c) 1988-2005 Microsoft Corporation  Workgroup Edition on Windows NT 6.0 (Build 6002: Service Pack 2) 


У меня есть файлы для импорта (в формате csv). Они бывают двух видов. Отличаются количеством столбцов и некоторой не особо полезной информацией. В зависимости от файла я хочу с помощью BULK INSERT загружать их во временную таблицу и определенным образом парсить. Чтобы не плодить однообразный код для разных типов файлов, я хотел сделать, чтобы в зависимости от типа файла создавалась временная таблица нужно структуры. Однако не могу сделать CREATE PROCEDURE, возникает ошибка "В базе данных уже существует объект с именем "#reg"."

Вот минимальный пример, который у меня не работает
CREATE PROCEDURE [dbo].[TEST]
AS
BEGIN
	SET NOCOUNT ON;

	IF OBJECT_ID('tempdb..#reg') IS NULL
		DROP TABLE #reg

	IF @@SPID = 80
		CREATE TABLE #reg(ID INT PRIMARY KEY)
	ELSE
		CREATE TABLE #reg(ID UNIQUEIDENTIFIER PRIMARY KEY)

	IF OBJECT_ID('tempdb..#reg') IS NULL
		DROP TABLE #reg
END

Можно ли как-то "убедить" сервер, что это не повторное создание объекта?


Тоже столкнулся с аналогичной "бедой", при alter trigger жалуется на код:

if (select object_id(N'[tempdb].[dbo].[#t]' )) is null 
 begin 
	 CREATE Table [#t] ( 	
	[ID] [int] NULL)
 end 
						
if (select object_id(N'[tempdb].[dbo].[#t]' )) is null 
 begin
	 CREATE Table [#t] ( 	
	[ID] [int] NULL)
 end 


и собственно такой же вопрос:

Можно ли как-то "убедить" сервер, что это не повторное создание объекта?

PS
Microsoft SQL Server 2008 (SP3) - 10.0.5835.0 (Intel X86)
Mar 1 2013 18:44:43
Copyright (c) 1988-2008 Microsoft Corporation
Standard Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
19 дек 13, 10:48    [15315824]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104760
PaulWist
Можно ли как-то "убедить" сервер, что это не повторное создание объекта?

Нет
19 дек 13, 10:55    [15315875]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
PaulWist
Member

Откуда:
Сообщений: 2231
Glory
PaulWist
Можно ли как-то "убедить" сервер, что это не повторное создание объекта?

Нет


Glory - как всегда лаконичен, спс :)
19 дек 13, 10:59    [15315920]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
invm
Member

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

13610259
19 дек 13, 11:28    [15316150]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
PaulWist
Member

Откуда:
Сообщений: 2231
invm
PaulWist,

13610259


Не подходит, логика такая (схематично).

alter trigger

if условие1 create table #t1

if условие2 create table #t1

if условие3 create table #t1


те если какие-то условия выполняются, то надо создать временную таблицу, а если нет то не надо, причём в 99% времянку создавать не надо, те даже DUMMY таблица не нужна.
19 дек 13, 12:10    [15316518]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104760
PaulWist
Не подходит, логика такая (схематично).

Это 3 триггера - на каждое условие
19 дек 13, 12:21    [15316620]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
PaulWist
те если какие-то условия выполняются, то надо создать временную таблицу, а если нет то не надо, причём в 99% времянку создавать не надо, те даже DUMMY таблица не нужна.
Что мешает безусловно создавать временную таблицу с dummy-столбцом?
19 дек 13, 12:28    [15316677]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
PaulWist
Member

Откуда:
Сообщений: 2231
invm
PaulWist
те если какие-то условия выполняются, то надо создать временную таблицу, а если нет то не надо, причём в 99% времянку создавать не надо, те даже DUMMY таблица не нужна.
Что мешает безусловно создавать временную таблицу с dummy-столбцом?


Возможно в 2008 сервере что-то изменилось, но в предыдущих версиях создание объекта в теле процедуры приводило к перекомпиляции процедуры, если я не прав поправьте.
19 дек 13, 12:43    [15316846]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
invm
Member

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

Естественно будут перекомпиляции инструкций в триггере. Но об этом надо было думать раньше, до того как родился триггер, работающий с таблицей неизвестной структуры.
19 дек 13, 13:12    [15317088]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
Paul Chabinsky
Member

Откуда:
Сообщений: 322
If 1 1=2
Select 1 a, 1 b into #tmp
else
select 'q' a, 1 b into #tmp

select a, b from #tmp
19 дек 13, 19:23    [15319791]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
_djХомяГ
Guest
Супер
There is already an object named '#tmp' in the database.
19 дек 13, 19:26    [15319817]     Ответить | Цитировать Сообщить модератору
 Re: Временная таблица в ХП  [new]
Paul Chabinsky
Member

Откуда:
Сообщений: 322
_djХомяГ,

create proc common
as
select * from #tmp
go

create proc init0
as
select 1 a, 2 b into #tmp
exec common
go

create proc init1
as
select 'a' a, 2 b into #tmp
exec common
go

exec init0
go

exec init1
go
19 дек 13, 20:08    [15319982]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить