Есть ли поле в таблице

16022010
Дата: 16.02.2010 11:37:08
Здравствуйте !
Подскажите пожалуйста, как узнать есть ли поле в #таблице и какого оно типа ?
Паганель
Дата: 16.02.2010 11:43:27
16022010
есть ли поле в #таблице и какого оно типа ?
Так Вы же сами создали эту временную таблицу...
Сергей Мишин
Дата: 16.02.2010 11:53:16
16022010,

IF object_id('tempdb..#t') IS NULL
	CREATE TABLE #t (i int, j int)

SELECT
	*
FROM tempdb.sys.all_columns
WHERE object_id('tempdb..#t')=object_id
16022010
Дата: 16.02.2010 12:23:42
Не получается. Таблица #Tmp получается локальная.
CREATE PROCEDURE Test2
AS
create table #Tmp(Id2 int)
insert into #Tmp values(2)
select * from #Tmp
drop table #Tmp

CREATE PROCEDURE Test
AS
create table #Tmp(Id1 int)
insert into #Tmp values(1)

exec Test2

select * from #Tmp
drop table #Tmp


В общем задача такова. В процедуре заполняется временная таблица, которая создаётся и уничтожается в других процедурах. Код заполнения довольно большой, поэтому я и решил вынести в отдельную процу, дабы вызывать её из других процедур. В момент заполнения нужно проверить, существует ли в временой таблице поле, если да, то можно его заполнять. Временная таблица создаётся динамически, и колонки которые в ней будут заранее не известны
Гавриленко Сергей Алексеевич
Дата: 16.02.2010 12:24:37
А зачем вы создаете таблицу еще и в процедуре?
Glory
Дата: 16.02.2010 12:26:41
16022010
Временная таблица создаётся динамически, и колонки которые в ней будут заранее не известны

Динамически созданная временная таблица будет автоматически удалена при окончании этого динамического запроса
Также как и созданная в процедуре временная таблица будет автоматически удалена при окончании этой процедуры
16022101
Дата: 16.02.2010 12:50:31
Гавриленко Сергей Алексеевич
А зачем вы создаете таблицу еще и в процедуре?

Это я для примера, вопрос остаётся, как узнать наличие колонки в той временной таблице, которая создана в другой процедуре
16022010
Дата: 16.02.2010 12:59:29
Объясню ещё раз подробнее.
В нескольких процедурах создается временная таблица #Tmp с набором статических полей. Затем в эта таблица расширяется дополнительными полями. Какие это будут поля, заранее не известно. Расширяется путём формирования строки и её выполнения. Затем, вызывается вторая процедура, которая заполняет эту #Tmp данными. Из разных процедур вызывается одна и таже процедура заполнения, дабы не писать код заполнения в каждой процедуре (и править его будет легче в одном месте). В момент заполнения в статические поля попадают статические данные, соответственно в динамические поля - динамические данные. Нужно узнать, какие (динамические) поля есть в этой таблице.
Сергей Мишин
Дата: 16.02.2010 13:46:52
16022010,
а что не получается? как узнать поле написано выше, время жизни таблицы тоже.
IF object_id('p1')>0
	DROP PROC p1
GO
CREATE PROC p1 AS alter table #t add b int
GO
IF object_id('p2')>0
	DROP PROC p2
GO
CREATE PROC p2 AS
IF EXISTS(SELECT * FROM tempdb.sys.all_columns WHERE object_id('tempdb..#t')=object_id AND name='b')
	INSERT #t (b) SELECT 2
GO
IF object_id('p3')>0
	DROP PROC p3
GO
CREATE PROC p3 AS
	CREATE TABLE #t (i int)
	EXEC p1
	EXEC p2
	SELECT * FROM #t

GO

EXEC p3
но имхо, велосипед изобретаете
16021020
Дата: 16.02.2010 13:51:37
Invalid object name 'tempdb.sys.all_columns'