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

Откуда: Подмосковье
Сообщений: 229
Исходные данные.

Надо из внешней программы (используется ADO) вставлять и обновлять записи, считывая при этом обратно значения из вставленной/отредактированной записи.

Например:
CREATE TABLE [dbo].[MyTable](
	[ID] [int] IDENTITY(0,1) NOT NULL,
	[TextValue] [nvarchar](512) NULL);
GO

DECLARE @MyTableVar TABLE(return_id INT);
INSERT INTO [dbo].[MyTable] ([TextValue]) OUTPUT INSERTED.[ID] INTO @MyTableVar([return_id]) VALUES (N"bla-bla-bla");
SELECT [return_id] from @MyTableVar;

DROP TABLE [dbo].[MyTable];


Всё хорошо. Но душа хочет халявы!
Дело в том, что такой "алгоритм" используется для разных таблиц, типы данных полей которых заранее не известны.
Можно конечно запросить их из "syscolumns join systypes", но вот, например, Oracle может так:
DECLARE myvar TABLE_OR_VIEW_NAME.COLUMN_NAME%TYPE;

т.е. просто при объявлении переменной сразу объявить ее того же типа, что и определенное поле таблицы.

Вопрос, а MS SQL так может?



Когда все способы испробованы, а результата все нет, - прочтите наконец инструкцию!
29 май 14, 15:18    [16092035]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить тип данных для поля таблицы - халявный способ  [new]
Glory
Member

Откуда:
Сообщений: 104751
MustDie
т.е. просто при объявлении переменной сразу объявить ее того же типа, что и определенное поле таблицы.

Вопрос, а MS SQL так может?

Не может
Он может
DECLARE @var1 sql_variant
Куда можно записать любой тип данных
29 май 14, 15:23    [16092061]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить тип данных для поля таблицы - халявный способ  [new]
wizli
Member

Откуда: Minsk
Сообщений: 270
MustDie,
Если я правильно вас понял, то вам подойдет эта конструкция. Она создаст таблицу такого же типа, как и та, из которой он берет данные.
SELECT *
INTO newtable
FROM table1;
29 май 14, 15:26    [16092091]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить тип данных для поля таблицы - халявный способ  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
select top (0) * into #t from [dbo].[MyTable];
INSERT INTO [dbo].[MyTable] ([TextValue]) OUTPUT INSERTED.* INTO #t VALUES (N"bla-bla-bla");
SELECT * from #t;
29 май 14, 16:10    [16092488]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить тип данных для поля таблицы - халявный способ  [new]
MustDie
Member

Откуда: Подмосковье
Сообщений: 229
Спасибо!
Ответ Glory наиболее близок к цели.
Остальные предложения, как мне кажется, будут более требовательны к ресурсам, так как будет выполнятся кэширование всех полей.
Если даже не делать OUTPUT INSERTED.* , а указывать конкретное поле, то при объявлении "шаблона таблицы"
select top (0) * into #t from [dbo].[MyTable];

сервер будет выделять ресурсы под каждое поле.
А нужно на выход, как правило, одно поле - PK.
Предполагая, что объявление переменной неопределенного типа sql_variant должно отъедать больше памяти, чем выделение под конкретный тип, я все же решил остановиться на варианте - "заранее 1 раз считал типы полей, потом воспользовался".


Вывод: Халявы не бывает...
29 май 14, 18:02    [16093568]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить тип данных для поля таблицы - халявный способ  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Off

MustDie
select top (0) * into #t from [dbo].[MyTable];

сервер будет выделять ресурсы под каждое поле.
А тут типа писать имя поля вместо звёздочки религия не позволяет?
MustDie
Предполагая, что объявление переменной неопределенного типа sql_variant должно отъедать больше памяти, чем выделение под конкретный тип
Угу, целый гектар на поле.
Одни домыслы никак не коррелирующие с реальностью. Совсем.

Да одно только наличие #T ужирает ресурсы в несравнимо больше.

Это вам не оракакл, который компилирует тело процедуры в нативный код заранее. Это интерпретатор TSQL с компиляцией DML (только) стейтментов.
Тут лучше меньше команд и промежуточных значений (которые чаще пишутся не для решения задачи, а для себя ленивого на подумать).
30 май 14, 00:48    [16095000]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить