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

Откуда:
Сообщений: 89
С запросом происходит что-то непонятное.
Нужно при INSERT скопировать данные из TABLE1 в TABLE2.

DECLARE @col1 int;
SELECT @col1 = COLUMN1
FROM TABLE1;
DECLARE @col2 int;
SELECT @col2 = COLUMN2
FROM TABLE1;
DECLARE @col3 int;
SELECT @lastuser = COLUMN3
FROM TABLE1;
DECLARE @col4 int;
SELECT @col4 = COLUMN4
FROM TABLE1;
DECLARE @col5 int;
SELECT @col5 = COLUMN5
FROM TABLE1;
INSERT INTO TABLE2 (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5)
VALUES
(@col1,@col2,@col3,@col4,@col5)

В TABLE1 имеется 10 строк. Но в TABLE2 из них копируется лишь одна, последняя.

Уже голову сломал над этим. Не знаю почему так.

По идее если я не задаю условие WHERE он должен выбирать все строки, и все вставлять во вторую таблицу.
24 июл 12, 10:30    [12906681]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
мое_имхо
Guest
elshad82,

при 10 строках в табле1 ошибка должна вываливаться уже на первом селесте
24 июл 12, 10:37    [12906719]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
Alexandr Kr.
Member

Откуда: Украина, Харьков
Сообщений: 165
elshad82,

Так ведь все правильно копирует. Где вы вообще такой метод нашли копрования строк?
сделайте так копирование
INSERT INTO TABLE2 (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5)
select COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5 from Table1

И будет счастье.

А ваш вариант скопирует только одну строку при чем нет гарантии что все 5 переменных заполнятся из одной и той же строки
24 июл 12, 10:41    [12906742]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3105
elshad82
С запросом происходит что-то непонятное.
Нужно при INSERT скопировать данные из TABLE1 в TABLE2.

DECLARE @col1 int;
SELECT @col1 = COLUMN1
FROM TABLE1;
DECLARE @col2 int;
SELECT @col2 = COLUMN2
FROM TABLE1;
DECLARE @col3 int;
SELECT @lastuser = COLUMN3
FROM TABLE1;
DECLARE @col4 int;
SELECT @col4 = COLUMN4
FROM TABLE1;
DECLARE @col5 int;
SELECT @col5 = COLUMN5
FROM TABLE1;
INSERT INTO TABLE2 (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5)
VALUES
(@col1,@col2,@col3,@col4,@col5)

В TABLE1 имеется 10 строк. Но в TABLE2 из них копируется лишь одна, последняя.

Уже голову сломал над этим. Не знаю почему так.

По идее если я не задаю условие WHERE он должен выбирать все строки, и все вставлять во вторую таблицу.

а зачем так сложно, разве нельзя так сделать?
INSERT INTO TABLE2 (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5) 
SELECT COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5 FROM TABLE1
24 июл 12, 10:42    [12906744]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
Ошибок нет.
Но по окончании СЕЛЕКТА выдается лишь одна колонка (напр. COLUMN3) в 10 строк со значением NULL.
А в ТАБЛУ2 вставляется лишь одна строка, но с данными как в ТАБЛЕ1

На самом деле TABLE1 вовсе не TABLE1, а inserted
Я пишу этот код в триггере
24 июл 12, 11:04    [12906961]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
ЛеньПарольВспоминать
Guest
elshad82
На самом деле TABLE1 вовсе не TABLE1, а inserted
Я пишу этот код в триггере

И что это меняет?

INSERT
INTO TABLE2 (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5) 
SELECT COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5
FROM inserted
24 июл 12, 11:44    [12907292]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
а если одна из колонок типа
SELECT 'MN' + RIGHT(COLUMN2, 28) AS 'MN_REF'
FROM inserted;

В таком случае делать INSERT (COLUMN1,MN_REF,COLUMN3,COLUMN4,COLUMN5) ?????

Думаю без объявления переменной не получиться

сейчас у меня в триггере вот так:
DECLARE @mnref;
SELECT @mnref = 'MN' + RIGHT(COLUMN2, 28)
FROM inserted;

То есть одну из колонок надо переносить не так как она есть, а с изменением заголовка с RN (в Таблице1) на MN (в Таблицу2).
То есть без объявления переменной не перенести. А может я чего-то не знаю?
24 июл 12, 12:03    [12907474]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
ЛеньПарольВспоминать
Guest
elshad82
а если одна из колонок типа
SELECT 'MN' + RIGHT(COLUMN2, 28) AS 'MN_REF'
FROM inserted;

В таком случае делать INSERT (COLUMN1,MN_REF,COLUMN3,COLUMN4,COLUMN5) ?????


В таком случае делать

INSERT
INTO TABLE2 (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5) 
SELECT COLUMN1, 'MN' + RIGHT(COLUMN2, 28), COLUMN3,COLUMN4,COLUMN5
FROM inserted



elshad82
Думаю без объявления переменной не получиться

сейчас у меня в триггере вот так:
DECLARE @mnref;
SELECT @mnref = 'MN' + RIGHT(COLUMN2, 28)
FROM inserted;

Вам уже сказали - подобная конструкция заполнит переменную ОДНИМ значением из всего множества, содержащихся в таблице (или псевдотаблице)

elshad82
А может я чего-то не знаю?

Как минимум - синтаксиса T-SQL

BOL вам в руки и чем скорее, тем лучше.
24 июл 12, 12:28    [12907673]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
elshad82,

Вам бы про тиреры почитать, а то у вас каша в голове и стандартная ошибка всех кто с тригерами первый раз работает, в том что в тригер передается не одна строка, а столько сколько было обработано командой изменения данных.

а это вобще бред
DECLARE @col1 int;
SELECT @col1 = COLUMN1
FROM TABLE1;

вы понимает что значение @col1 на выходе будет Абсолютно случайным, и из всего набора данных в колонке COLUMN1???
24 июл 12, 14:03    [12908300]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
WarAnt
elshad82,

Вам бы про тиреры почитать, а то у вас каша в голове и стандартная ошибка всех кто с тригерами первый раз работает, в том что в тригер передается не одна строка, а столько сколько было обработано командой изменения данных.

а это вобще бред
DECLARE @col1 int;
SELECT @col1 = COLUMN1
FROM TABLE1;

вы понимает что значение @col1 на выходе будет Абсолютно случайным, и из всего набора данных в колонке COLUMN1???


Команда изменения данных (то бишь данные в таблице inserted) создает например 3 строки, в этом случае на выходе получаю одну строку. Но если в таблице одна строка то без проблем.
У меня не получается сделать выборку нескольких таблиц.
Если просто селект, то без проблем. Типа:

SELECT COL1, COL2, COL3 FROM inserted.


На выходе я получу все свои строки. Но затем невозможно просто взять и вставить :

INSERT INTO TABLE2 (2COL1, 2COL2,2COL3)
VALUES
(COL1,COL2,COL3)

SQL просто не распознает что значит COL1, COL2 и COL3. Цитирую: Invalid column name 'COL1'.

Я не гуру SQL, знаю лишь основы T-SQL. Но если поможете поймать логическую цепочку, то думаю все получится.
Как мне правильно сделать выборку всех строк из inserted (ТАБЛ1) и определенные данные в ТАБЛ2?
Я думал что каждый столбец нужно объявить как переменную, а затем можно вставить в другую таблицу.
Просто написать INSERT INTO TABLE2 (2COL1,2COL2,2COL3) VALUES (COL1,COL2,COL3) или же (inserted.COL1,inserted.COL2,inserted.COL3) не получается. Система просто не распознает вводимые поля.

Помогите разобраться
24 июл 12, 21:35    [12910854]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
[quot elshad82]
WarAnt
elshad82,
У меня не получается сделать выборку нескольких таблиц.

то есть строк
24 июл 12, 21:36    [12910863]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
invm
Member

Откуда: Москва
Сообщений: 9915
elshad82, ответы не читаем? Документацию тоже не читаем?
ЛеньПарольВспоминать
INSERT
INTO TABLE2 (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5) 
SELECT COLUMN1, 'MN' + RIGHT(COLUMN2, 28), COLUMN3,COLUMN4,COLUMN5
FROM inserted
24 июл 12, 21:40    [12910873]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
invm
elshad82, ответы не читаем? Документацию тоже не читаем?
ЛеньПарольВспоминать
INSERT
INTO TABLE2 (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5) 
SELECT COLUMN1, 'MN' + RIGHT(COLUMN2, 28), COLUMN3,COLUMN4,COLUMN5
FROM inserted


Все я читаю. Но в коде
INSERT INTO TABLE2 (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5)
Эти самые COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5 система видит как заголовки вводимых полей ТАБЛИЦЫ2, а не значения ТАБЛИЦЫ1 которые выбраны в СЕЛЕКТе.

Приходится вводить
INSERT
INTO TABLE2 (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5) заголовки колонок таблицы2
VALUES (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5) поля выбранные в селекте внизу (но их система не видит - Invalid column name 'COLUMN1)'
SELECT COLUMN1, 'MN' + RIGHT(COLUMN2, 28), COLUMN3,COLUMN4,COLUMN5
24 июл 12, 21:50    [12910889]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
invm
Member

Откуда: Москва
Сообщений: 9915
elshad82, пока будете выдумывать синтаксис, ничего у вас не заработает. Сервер не умеет читать мысли и выполнять желания.
24 июл 12, 22:05    [12910921]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

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


Я и не выдумываю. Использую то что позволяет система.

INSERT INTO TABLE2 (T1COL1,T1COL2,T1COL3)
SELECT T1COL1,T1COL2,T1COL3
FROM TABLE1

Так просто не работает
Система требует:

INSERT INTO TABLE2 (T2COL1,T2COL2,T3COL3)
VALUES (T1COL1,T1COL2,T1COL3)

где (T2COL1,T2COL2,T2COL3) это поля в TABLE2 куда и надо вставить данные (T1COL1,T1COL2,T1COL3) из TABLE1.

Вы то говорите выполни INSERT INTO TABLE2 (T1COL1,T1COL2,T1COL3), но эти колонки не распознаются. Система предпологает там заголовки таблицы2.
24 июл 12, 22:13    [12910941]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
SQL INSERT INTO Syntax

It is possible to write the INSERT INTO statement in two forms.

The first form doesn't specify the column names where the data will be inserted, only their values:
INSERT INTO table_name
VALUES (value1, value2, value3,...)

The second form specifies both the column names and the values to be inserted:
INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

Это не я выдумал
24 июл 12, 22:25    [12910983]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
Это просто селект. Данные есть

К сообщению приложен файл. Размер - 13Kb
24 июл 12, 22:59    [12911048]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
А тут тот же Селект, с Инсертом. Синтаксис как вы говорили так и написал. Ошибка

К сообщению приложен файл. Размер - 12Kb
24 июл 12, 23:00    [12911050]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
invm
Member

Откуда: Москва
Сообщений: 9915
Надо читать документацию по используемому продукту, а не хрен знает что.
Хотя бы, для начала, вот эту статью -- http://msdn.microsoft.com/en-us/library/ms174335%28SQL.100%29.aspx

Ну и для особо упертых:
use tempdb;
go

create table dbo.Table1(table1_column1 varchar(10), table1_column2 varchar(10));
create table dbo.Table2(table2_column1 varchar(50));
go

create trigger dbo.trOnInser_Table1
on dbo.Table1
for insert
as
begin
 set nocount on;
 
 insert into dbo.Table2
  (table2_column1)
  select
   table1_column1 + table1_column2
  from
   inserted;
end;
go

insert into dbo.Table1
 (table1_column1, table1_column2)
values
 ('aaa', 'bbb');
 
select * from dbo.Table1;
select * from dbo.Table2;
go

drop table dbo.Table1;
drop table dbo.Table2;
go
24 июл 12, 23:05    [12911065]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
Не знаю имеет это значение или нет, но названия полей в ТАБЛ1 и ТАБЛ2 не идеинтичны.
Другими словами я хочу вставить данные из TABL1.COL1 в TABL2.CLL2.
Причем не все поля из ТАБЛ1 в ТАБЛ2 надо перенести, а некоторые (выборочно).

Пример:
TABL1.COL1 в TABL2.COL5 и в TABL2.COL6,
TABL1.COL2 в TABL2.COL1,
TABL1.COL3 в TABL2.COL3,
NULL в TABL2.COL4
24 июл 12, 23:16    [12911092]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
Ну все, получилось.

Спасибо всем за участие и терпение. Решение оказалось очень простым. Система не распознавала таблицы как TABLE1, TABLE2
Надо было писать dbname.dbo.table1 а не просто table1. Маразм какой-то.

Пора спать уже.
25 июл 12, 00:08    [12911208]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
Glory
Member

Откуда:
Сообщений: 104751
elshad82
Надо было писать dbname.dbo.table1 а не просто table1. Маразм какой-то.

Это не маразм. Это полное именование объектов.
25 июл 12, 12:58    [12913411]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
Glory
elshad82
Надо было писать dbname.dbo.table1 а не просто table1. Маразм какой-то.

Это не маразм. Это полное именование объектов.


Как познавательно. Я знаю что это такое. Маразм то что работая в данной Базе данных, система должна понимать что если я пишу FROM table1, то table1 это таблица. А ему подавай название целиком. В SQL 2000 можно было обходиться одним лишь названием table1. Неужели к моменту выпуска SQL 2008 R2 синтаксис поменялся? Или T-SQL стал менее догадливым?

Это я так к слову. Факт то что система должна понимать что в СЕЛЕКТе, значение стоящее после FROM - это таблица
25 июл 12, 16:06    [12914787]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
elshad82
Glory
пропущено...

Это не маразм. Это полное именование объектов.


Как познавательно. Я знаю что это такое. Маразм то что работая в данной Базе данных, система должна понимать что если я пишу FROM table1, то table1 это таблица. А ему подавай название целиком. В SQL 2000 можно было обходиться одним лишь названием table1. Неужели к моменту выпуска SQL 2008 R2 синтаксис поменялся? Или T-SQL стал менее догадливым?
Маразм - писать объекты без схемы, а потом удивляться, что сервер не находит таблицу, или находит не ту.
25 июл 12, 16:07    [12914801]     Ответить | Цитировать Сообщить модератору
 Re: Запрос неправильно создает INSERT  [new]
elshad82
Member

Откуда:
Сообщений: 89
То есть вы думаете что если в окне запроса базы dbname, написать

SELECT *
FROM table1

система не должна понимать суть запроса?
И объязательно надо писать

SELECT *
FROM dbname.dbo.table1 ???

Еще раз говорю - SQL 2000 прекрасно справлялся с этой задачей.

Только не надо говорить что иди тогда и пользуйся SQL 2000. Я вам про логику запроса говорю а вы про схемы. В любой реляционной СУБД под языком SQL (Oracle, MySQL, Postgre и даже MS SQL в теории) можно выполнить запрос

SELECT *
FROM table1

если мы указали что работаем в БД dbname
25 июл 12, 16:17    [12914879]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить