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

Откуда:
Сообщений: 85
Есть таблица, в ней около сотни полей, нужно вставить запись, идентичную уже существующей, но с другим ID. Можно ли это сделть как-то типа
INSERT INTO Table SELECT * FROM Table WHERE ID = 100

чтобы не писать длинный запрос с перечислением всех полей и их значений, но чтобы при этом ID подставлялся новый?
6 фев 12, 16:39    [12042131]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ID - IDENTITY?

В чём проблема перечислить поля через запятую в INSERT и SELECT?

P.S. Неудачное название таблицы (совпадает с ключевым словом).
6 фев 12, 16:49    [12042243]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
SSV_RIF
Member

Откуда:
Сообщений: 85
ID - uniqueidentifier
в таблице около сотни полей, перечислять не очень то хочется
это не имя таблицы, это просто для примера...
6 фев 12, 17:05    [12042380]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SSV_RIF
ID - uniqueidentifier
в таблице около сотни полей, перечислять не очень то хочется
это не имя таблицы, это просто для примера...
По-Вашему, 100 очень похоже на GUID, да?
ALTER TABLE [Table] ADD CONSTRAINT DefaultTableID DEFAULT(NEWID());
6 фев 12, 17:14    [12042453]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
SSV_RIF
в таблице около сотни полей, перечислять не очень то хочется
Поля надо перечислять.
6 фев 12, 17:16    [12042470]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Гавриленко Сергей Алексеевич
SSV_RIF
в таблице около сотни полей, перечислять не очень то хочется
Поля надо перечислять.


Строго сказать, можно использовать динамический sql: взять список названий полей искомой таблицы из представления syscolumns, и сконструировать нужный запрос. Текста, в итоге, будет, наверное, меньше, чем перечислять 100 полей. Если наглядность важнее скорости работы, то почему бы и нет?
6 фев 12, 18:05    [12042908]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
SSV_RIF
чтобы не писать длинный запрос с перечислением всех полей и их значений
Для чего, что бы не перетаскивать мышкой список полей?
6 фев 12, 18:22    [12042995]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
alexeyvg
SSV_RIF
чтобы не писать длинный запрос с перечислением всех полей и их значений
Для чего, что бы не перетаскивать мышкой список полей?

Мало ли. Может быть, список полей часто меняется. Или клиент многократно передает на выполнение один и тот же запрос для разных таблиц - понятно, что намного легче сконструировать запрос, подставив в него только имя таблицы, чем подставлять список из 100 полей, причем разных для разных таблиц. Я бы не стал по умолчанию предполагать ТС безумцем :)
6 фев 12, 19:10    [12043241]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
SSV_RIF
Member

Откуда:
Сообщений: 85
iap
SSV_RIF
ID - uniqueidentifier
в таблице около сотни полей, перечислять не очень то хочется
это не имя таблицы, это просто для примера...
По-Вашему, 100 очень похоже на GUID, да?
ALTER TABLE [Table] ADD CONSTRAINT DefaultTableID DEFAULT(NEWID());

я понимаю ваш юношеский максимализм и проистекающий из него сарказм, но позволю себе еще раз напомнить - название таблицы вы тоже приняли за реальное...
7 фев 12, 07:49    [12044625]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
SSV_RIF
Member

Откуда:
Сообщений: 85
Вобщем, если кому интересно, сделал так:

INSERT Table_test DEFAULT VALUES

взял получившийся ID = '41628795-8BAF-48AC-8ACF-CA22FF1F4F2F' и уже с ним:

update Table_test set
	Table_test.[Field1] = tt.Field1,
        .
        .
        .
        Table_test.[Field100] = tt.[Field100]
from Table_test tt 
left join Table_test on Table_test .ID = '41628795-8BAF-48AC-8ACF-CA22FF1F4F2F'
where tt.ID = '4E8FAD2C-CB06-4342-8805-E1E7BDEEC410'
7 фев 12, 08:07    [12044646]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
qwerty112
Guest
SSV_RIF
Вобщем, если кому интересно, сделал так:

INSERT Table_test DEFAULT VALUES

взял получившийся ID = '41628795-8BAF-48AC-8ACF-CA22FF1F4F2F' и уже с ним:

update Table_test set
	Table_test.[Field1] = tt.Field1,
        .
        .
        .
        Table_test.[Field100] = tt.[Field100]
from Table_test tt 
left join Table_test on Table_test .ID = '41628795-8BAF-48AC-8ACF-CA22FF1F4F2F'
where tt.ID = '4E8FAD2C-CB06-4342-8805-E1E7BDEEC410'

и чем, перечисление полей в UPDATE - лучше перечисления в INSERT ?
вместо 1-го запроса - получили - 2-а ...
7 фев 12, 08:21    [12044664]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
SSV_RIF
Вобщем, если кому интересно, сделал так:
...

qwerty112
и чем, перечисление полей в UPDATE - лучше перечисления в INSERT ?


Ага, получилось что-то вроде йоговского упражнения: почесать левое ухо правой ногой :).

Слишком сложно, во-первых, и непонятно, как это решает поставленную задачу - " не писать длинный запрос с перечислением всех полей и их значений". Плюс, запрос с выборкой данных может работать в сотню раз медленнее простого
insert into Table_test ([Field1],...,[Field100])
select [Field1],...,[Field100] from Table_test where ID = '4E8FAD2C-CB06-4342-8805-E1E7BDEEC410'

например, если данные в Table_test интенсивно кладутся из нескольких рук, а по id не создан кластерный индекс.

Итого, я рискну предположить, что вот эта конструкция -
insert into Table_test ([Field1],...,[Field100])
select [Field1],...,[Field100] from Table_test where ID = '4E8FAD2C-CB06-4342-8805-E1E7BDEEC410'

или
insert into Table_test (ID,[Field1],...,[Field100])
select newid(),[Field1],...,[Field100] from Table_test where ID = '4E8FAD2C-CB06-4342-8805-E1E7BDEEC410'

и была нужна автору топика первоначально. Т.е. вопрос просто в синтаксисе :).
7 фев 12, 16:03    [12048002]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
SSV_RIF
Member

Откуда:
Сообщений: 85
Shlippenbaranus
Слишком сложно, во-первых, и непонятно, как это решает поставленную задачу - " не писать длинный запрос с перечислением всех полей и их значений".


ну вот где вы раньше были?
а по поводу "не писать длинный запрос" - представьте, как бы выглядел запрос, если бы пришлось писать:
INSERT INTO Table_test(Field1,...,Field100) VALUES(Value1,...,Value100)

вот об этом речь и шла...
8 фев 12, 08:52    [12051566]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
SSV_RIF
ну вот где вы раньше были?


:). Дело в том, что возможность ограничить список полей, вставляемых при помощи insert, написав
insert into Table_test(Field1,...,Field100) select ...
вместо
insert into Table_test select ...[
относится к элементарным вещам, настолько, что никому из ответивших Вам обитателей форума наверняка даже в голову не пришло, что вы об этом не знаете. Все решили, что знаете, но перечислять 100 названий полей (не значений, а именно названий) в скобках после insert вам по каким-то причинам не хочется. См. первый пост iap. Догадаться, в чем был вопрос, я лично смог только после примера с update-ом.

Итого - читайте хотя бы основы и пользуйтесь поиском прежде, чем спрашивать (пункт два "Рекомендаций по оформлению сообщений в форуме"), а если, все-таки, спросили и не поняты - не язвите в ответ, а попытайтесь понять со своей стороны, почему. См. пункт десятый тех же "Рекомендаций..." :).
8 фев 12, 13:15    [12053333]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
StPatrick
Member

Откуда:
Сообщений: 28
Если с identity, то можно так (сформулировал свой вопрос и ответил на него)
if object_id('tempdb.dbo.#Temp') is not null
	drop table #Temp

declare @Temp table (ID bigint identity(1, 1), Number nvarchar(128), Number2 nvarchar(128), Number3 nvarchar(128), Number4 nvarchar(128))
declare @ID bigint

insert into @Temp
select 'Ваапвап', 'asdasd', 'asdsdf3434sdf', 'asdadasd'

select @ID = ID from @Temp

select *
into dbo.#Temp
from @Temp
where ID = @ID

alter table dbo.#Temp drop column ID 

insert into @Temp
select * from #Temp

select * from @Temp


А вообще - хорошо было бы иметь синтаксис, позволяющий выбирать "все поля, кроме" :)
8 фев 12, 17:18    [12056553]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
StPatrick
....
insert into @Temp
select * from #Temp
....



Охренеть!!!

На выделенном мной этапе таблицы @Temp и #Temp включают разное количество столбцов, как движок MS SQL различает, какое поле в @Temp соответствует полю в #Temp, и почему именно поле ID следует обойти? Почему не возникает
Insert Error: Column name or number of supplied values does not match table definition.
?

Что любопытно, код от StPatrick работает. Чудо?
8 фев 12, 19:09    [12057342]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Разобрался: If a column is not in column_list, the Database Engine must be able to provide a value based on the definition of the column; otherwise, the row cannot be loaded. Соответственно,
create table tx (x int identity, y int)
insert into tx select 1
select * from tx
работает и возвращает
11
8 фев 12, 19:51    [12057623]     Ответить | Цитировать Сообщить модератору
 Re: Вставить запись, идентичную существующей...  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Shlippenbaranus
Разобрался: If a column is not in column_list, the Database Engine must be able to provide a value based on the definition of the column; otherwise, the row cannot be loaded.

С другой стороны, если понимать данную фразу широко, т.е. как разрешение не писать column_list вообще, если количество колонок в select-части запроса достаточно для того, чтобы заполнить вставляемую строку с учетом автоматически назначаемых значений, то почему не работает это:
create table z (x int, y int default 0)
insert into z select 1
?
Ведь буква описания выполнена:
msdn
The Database Engine automatically provides a value for the column if the column:
- Has an IDENTITY property. The next incremental identity value is used.
- Has a default. The default value for the column is used.
- ...

Т.е. я, конечно, могу понять, почему: значния по умолчанию можно указывать для нескольких колонок, соотв., если бы оно работало, движок приходил бы в задумчивость, когда я бы писал
create table z (x int default 0, y int default 0)
insert into z select 1

Но почему одну и ту же фразу документации нужно понимать по-разному для разных ситуаций?

Итого - охренеть.
8 фев 12, 20:28    [12057851]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить