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

Откуда:
Сообщений: 180
нужно скопировать таблицу А в Б, как это сделать, если Б уже создана, т.е. запрос типа:
SELECT * INTO B FROM A
не подходит
22 ноя 05, 06:20    [2092422]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
insert into b (field1[, fieldn])
select field1[, fieldn] from a
22 ноя 05, 06:24    [2092424]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
aleks2
Guest
insert B
select * FROM A
22 ноя 05, 06:24    [2092425]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Kronix
Member

Откуда:
Сообщений: 180
aleks2
insert B
select * FROM A

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
22 ноя 05, 06:28    [2092426]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Kronix
aleks2
insert B
select * FROM A

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
А приведите ка всю СВОЮ инструкцию, а не цитируйте предлагаемые варианты.
Заодно, что вернет select @@version?
22 ноя 05, 06:34    [2092428]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Kronix
Member

Откуда:
Сообщений: 180
use databaseX
insert into B
select * from A
select @@version
Server: Msg 512, Level 16, State 1, Procedure TrCenyINSERT1, Line 6
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
22 ноя 05, 06:45    [2092435]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Kronix
Member

Откуда:
Сообщений: 180
версия - Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on Windows NT 5.2 (Build 3790: )
22 ноя 05, 06:48    [2092436]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
DDL таблицы A можно увидеть (заодно, и таблицы B)?
22 ноя 05, 06:49    [2092439]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Kronix
Member

Откуда:
Сообщений: 180
DDL - это структура таблицы?
22 ноя 05, 06:52    [2092440]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
aleks2
Guest
Kronix
use databaseX
insert into B
select * from A
select @@version
Server: Msg 512, Level 16, State 1, Procedure TrCenyINSERT1, Line 6
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.


использование
insert into B
select * from A
предполагает, что определения А и B - тождественны (вплоть до порядка столбцов в них) и не содержат IDENTITY И вычисляемые столбцы. В противном случае - требуется ЯВНОЕ перечисление столбцов

insert into B(col1, col2...)
select x1, x2... from A
22 ноя 05, 06:53    [2092441]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Kronix
DDL - это структура таблицы?
Да.
22 ноя 05, 06:53    [2092442]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Kronix
Member

Откуда:
Сообщений: 180
наверное неправильно пошел, навешал на таблицу A триггеры, для того чтобы они сработали на уже существующие данные создал таблицу B(видимо криво) и навешал те же триггеры, оставалось скопировать данные из А в Б, но как я вижу это сложнее, гораздо легче прочитать построчно таблицу.
Тогда вопрос: как прочитать таблиццу построчно?
Цикл от 1 до последней строчки
считываем строчку
выполняем действие
конец цикла
22 ноя 05, 08:02    [2092491]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Да у вас наверняка триггеры написаны из предположения, что они срабатывают на каждую строку, а они срабанывают на все строки, затрагиваемые инструкцией. Измените триггеры, зделайте их правильными ;)
22 ноя 05, 08:05    [2092496]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
Смотрим в БОЛ DECLARE CURSOR
22 ноя 05, 08:08    [2092498]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Да, не надо тут никаких курсоров - на лицо кривые триггеры - переписывать надо, а то так можно допроектироваться
22 ноя 05, 08:31    [2092525]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Kronix
Member

Откуда:
Сообщений: 180
Кривые триггеры? что ж тут не так:
CREATE TRIGGER TrCenyINSERT ON _1sconst
after INSERT, UPDATE
AS
set nocount on
DECLARE @type smallint
set @type=(select sp172 from sc171 inner join INSERTED on INSERTED.objid=sc171.id where INSERTED.id=173)
if (@type='3') or (@type='4')
begin
INSERT dbo.tovar_ceny
SELECT
(select parentext from sc171 inner join INSERTED on INSERTED.objid=sc171.id where INSERTED.id=173),
@type,
value , 'UPDATE'
FROM INSERTED where INSERTED.id=173
end
set nocount off
22 ноя 05, 08:38    [2092533]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
2 tpg

С курсорами или без, это не нам с Вами решать. Вы просили DDL Вам её не дали, а в друг у него из тригера вызывается какая нить процедура, и что тогда:
автор
Да, не надо тут никаких курсоров - на лицо кривые триггеры - переписывать надо, а то так можно допроектироваться
??????????

Человек спросил:
автор
Тогда вопрос: как прочитать таблиццу построчно?
Я ему ответил.

А судя по ошибке (это моё предположение)
Server: Msg 512, Level 16, State 1, Procedure TrCenyINSERT1, Line 6 то у Kronix-а так и есть, в триггере для каждой строки вызывается процедура
22 ноя 05, 08:39    [2092535]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Timon
А судя по ошибке (это моё предположение)
Server: Msg 512, Level 16, State 1, Procedure TrCenyINSERT1, Line 6 то у Kronix-а так и есть, в триггере для каждой строки вызывается процедура
Да нет там никакой процедуры...
Если я правильно понял логику триггера, достаточно вот так написать:
CREATE TRIGGER TrCenyINSERT ON _1sconst 
after INSERT, UPDATE
AS 
set nocount on 
INSERT dbo.tovar_ceny 
	select parentext,
	sp172 as type,
	value , 'UPDATE'
	from sc171 inner join
	INSERTED i on sc171.id = i.objid
		and i.id=173
		and (sp172 in(3, 4))
GO
22 ноя 05, 08:53    [2092558]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Kronix
Member

Откуда:
Сообщений: 180
спасибо за оптимизицию триггера, но что это дало? А можно как-то написать выгрузку без использования курсоров?
22 ноя 05, 10:09    [2092820]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Kronix
спасибо за оптимизицию триггера, но что это дало? А можно как-то написать выгрузку без использования курсоров?
С триггером, обрабатывающим все строки выражения никаких курсоров не требуется, пишите как тут предлагалось insert/select.
22 ноя 05, 10:15    [2092862]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kronix
спасибо за оптимизицию триггера, но что это дало? А можно как-то написать выгрузку без использования курсоров?

Ошибку генерировал как раз ваш триггер на строке
set @type=(select sp172 from sc171 inner join INSERTED on INSERTED.objid=sc171.id where INSERTED.id=173)
22 ноя 05, 10:20    [2092901]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Kronix
Member

Откуда:
Сообщений: 180
1.Ок, переписал все триггеры по данному примеру
2. создал таблицу _1sconst1 через generate SQL scripts со всеми ключами, триггерами и т.п.
5. insert _1sconst1 select * FROM _1sconst
An explicit value for the identity column in table '_1sconst1' can only be specified when a column list is used and IDENTITY_INSERT is ON.

как быть тут?
22 ноя 05, 10:29    [2092962]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Kronix
1.Ок, переписал все триггеры по данному примеру
2. создал таблицу _1sconst1 через generate SQL scripts со всеми ключами, триггерами и т.п.
5. insert _1sconst1 select * FROM _1sconst
An explicit value for the identity column in table '_1sconst1' can only be specified when a column list is used and IDENTITY_INSERT is ON.

как быть тут?
Прочитать в BOL про SET IDENTITY_INSERT.
22 ноя 05, 10:30    [2092972]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
Glory
Member

Откуда:
Сообщений: 104760
как быть тут?
Для начала учиться искаит ошибку в BOL. Потом в форуме. Потом уже спрашивать
22 ноя 05, 10:31    [2092973]     Ответить | Цитировать Сообщить модератору
 Re: как скопировать таблицу?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Или перечислить явно все колонки, кроме идентити. Но тогда может так статься, что значения в них в этих таблицах будут отличаться.
22 ноя 05, 10:32    [2092982]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить