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

Откуда:
Сообщений: 13
С SQL совсем не знаком-так, что не пинайте сильно, пожалуйста.
Задача очень простая, но не знаю как сделать правильный запрос.
Есть таблица, с 4 столбцами: Поле1, Поле2, Поле3, Поле4. В этих полях записаны данные. Необходимо заменить значение Поля2, оставив все остальные поля как есть. Есть текстовый файл со следующим содержимым: (Поле1, Поле2). Тип Поле1- PK, int, не NULL, Поле2 - binary(260), не NULL. Заменить надо не во всех строках, а только диапазон Поле1=45000-48000. MSSQL 2014. Заранее спасибо.
11 июл 15, 13:04    [17880016]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
oleg88rus,

загрузите свой файл в таблицу базы, после этого можете оперировать двумя таблицами

способов загрузки море, допустим BULK INSERT подойдет
https://msdn.microsoft.com/ru-ru/library/ms188365(v=sql.120).aspx
11 июл 15, 13:11    [17880033]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13
felix_ff

я совсем далек от SQL - мне бы готовый запрос. Я думал, что можно через UPDATE сделать, строки из текстового файла я могу прямо в запрос скопировать, типа как-то так:

UPDATE имя таблицы
бла-бла-бла

(Поле1, Поле2),
.................
(Поле1, Поле2);

Мне-бы готовый запрос, если можно. Спасибо большое...
11 июл 15, 13:18    [17880045]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13
Понимаю, что запрос элементарный-самому стыдно, но просто программированием никогда не занимался...
11 июл 15, 13:21    [17880048]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
oleg88rus,

приведите пример записей в вашем внешнем файле, надо понимать как идентифицировать два отдельных поля
11 июл 15, 13:24    [17880054]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13
Сам файл выглядит вот так:
(45001, '790=11128=45001=4245100=173', '0x94A098427B5D8F9F015EA971A59209358AF9A168B74ED4C627C385A7E0A87BAD91347AA6A576D9F00B6F88F78F9010208B1DD95BB4137D5AB964D8A9B022BD7901F5B0C321E7F184311682EAA5C4DA21DD6C972B8300564B255CAE1ACE46459B8D35A56F966324EEBAFF15437E4589CD03A3691152C0C5D1353E1BE31626904F14DD40D6857261DE55443919E4CD9BC7329CE82B244FF178B4CD312CE0D071CFBC3468A6CB97061213BE374A46F0CAB50FC09606C787E01E64ABFE8BAF0A915EE2E009AD8DCA376A3DBD8AC5AD8FC17B3FE372A8508AFAE09D74A7EE7F0625665FF6B996D4F7F55D3F9B85C31140825C1B96ED6A3768A501F342E1A1EDCE3165D996F13D', 11128)
(45002, '790=11128=45002=7484127=24', '0xB0D8F9876D209030FB454CA72091559BABD68421CC3AA0121D5CECDFC6F862F7BE240A5C78E3E2C463464218FC7741C9B45F9AC256970D00E441B376E2FBE3A2D999844397427E2098B0152BB7CF9647D9487CDC408A8AF529F2F409E67CE60B58B4EEA287E680BF9518F90196E7BDA8464F128C3B05839B908120F1621B09A93BEE02AE54728E743CF6E5DC82B05F189BF2B776A612C45A7160FEDBDB191AD5879616190FC117FC51E98460F4178A4BF00D2D539BA7AA9B3A4A3BD689B1882AD5C6CE04D315D29AAD71F5ACBF0398A03352C96327AF1F4E364EFF574A9046316B0361F288AB5C07607DC577F636396775BABC5ADC8A59180993770DC9CEF72E9A87C4AD', 11128)
(45003, '790=11128=45003=311000=246', '0x9223491991D7000A4D6FC16B7176AF4007B9CCACE2434886F191076BF527B189A6041A1C5B26159C2E1A63EC2A8147DDF8C36DF83BC196F7E1F7092F17689B1A558CC8EBB96C54A03790B1740F48B48A1A374D2F2876B91CA03F697DFD478A2B866C62A604CC19B585704D00B13B587E003BB031CC48EB0D08F21FF936BCB3560D97A1DE3A1FD8EBB69C3CE52E268550203F862746BA2A817EB3B188B1F5B30992AF94D918A5C43DAC94D70D738A529DCA2552CF3436B5C8A8C788862F268056DE6D7DCC8BF58912A99E9344378F10E09EDB284C0CADDA317493FE1C812EE75B840A05C66ACCC7EDC8144A2F2D638077331A413F2895109E0D99C260D830BE476D042AA9', 11128)
(45004, '790=11128=45004=3141736=177', '0xF781D0A443D782C40DE81FB99581A637F296A6E5B794F8A60EF3094E9E499CD0CDE6A2D7BF32CE6DFBE28842BB111A60F30797FE9945EEB0D6E12EAE3148566A0D25C6F7583346C9DA0F1AB5BFA8666FF1F7A51144CC7C01BE9613C9A75730AEC3FABB2F9F5C0E80020080CF0809217C9005E8A602538BBC69E2ADCCA036C554A21B79C0A61CF49AD1ED4368B622E10C7B8A5C9E23DEAD90FD7C5FAFD9940A3181B39ECB04ADB9673717243FEA2DDF3B76F10E5719D4E22AFFBD2260339DD220A949B84A356D78E3E46B6618E55D513DF1D085B66ED18EE45F16EE51BF6620AF32BB73293E0697B9FCF5E21FD1001DFF69B4C259FBED5D90B67A7A32A837950E979FADE4', 11128)

но он предназначен для другой таблицы и мне нужно значения из 3-го поля ('0xF781D0A443D7...), обновить в моей таблице (Поле2). Значения полей в Поле1 - в обоих таблицах одинаково. Я хотел отредактировать этот txt файл, удалив ненужные поля и поставив запятые после каждой строчки, но если можно без редактирования - вообще отлично будет, т. к. 3000 строк в файле. Если запутал - напишите, постараюсь объяснить подробней...
11 июл 15, 13:34    [17880087]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
1. В файле в каждой строке, кроме последней, ставите запятую после закрывающей скобки.
2. В скрипте
use МояБД;
go

begin tran;

update t
 set
  Поле2 = s.Поле2
from
 МояТаблица t join
 (
  select
   Поле1, convert(binary(260), Поле3, 1) as Поле2
  from
   (
    values
    ...
   ) a(Поле1, Поле2, Поле3, Поле4)
 ) s on s.Поле1 = t.Поле1
where
 t.Поле1 between 45000 and 48000;

select Поле1, Поле2 from МояТаблица where Поле1 between 45000 and 48000;

rollback;
вместо троеточия вставляете содержимое файла.
Выполняете и скрипт и проверяете результат. Если все ок, меняете в скрипте rollback на сщььше выполняете еще раз.
11 июл 15, 14:51    [17880223]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
oleg88rus,

DECLARE @tbl TABLE (ID INT IDENTITY(1,1), Data VARCHAR(MAX), XmlData xml)
DECLARE @tbl2 TABLE(ClientID INT, TxtData VARCHAR(MAX), BinData VARBINARY(MAX))

INSERT INTO @tbl (Data)
  SELECT Data.X
  FROM OPENROWSET( BULK 'C:\testload.txt', 
  FORMATFILE = 'c:\test.fmt') AS Data(X)

UPDATE @tbl
   SET Data = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(Data, '(', ''), ')', ''), CHAR(39), '')))

UPDATE @tbl
   SET XmlData = CONVERT(xml, '<row>' + replace(Data, ', ', '</row><row>') + '</row>')

INSERT INTO @tbl2 (ClientID, txtData, BinData)
  SELECT
        XmlData.value('/row[1]', 'INT'),
        XmlData.value('/row[3]', 'VARCHAR(max)'),
        CONVERT(VARBINARY(MAX), XmlData.value('/row[3]', 'VARCHAR(MAX)'))
  FROM @tbl

SELECT * FROM @tbl
SELECT * FROM @tbl2

/*
UPDATE T1
   SET [поле2] = x.TxtData
  FROM TABLE1 T1
      JOIN @tbl2 T2 ON T2.ClientID = T1.[Поле1]
 WHERE T1.[Поле1] BETWEEN 45000 AND 48000
*/


+ стуктура файла форматирования:

10.0
1
1       SQLCHAR             0       0       "\r\n"   1     data         Cyrillic_General_CI_AS



есть один нюанс: если у вас в таблице 1 поле2 типа varbinary то просто так запись varchar в него не покатит, а ее конверт выдаст не верный результат, тут надо будет повозиться
11 июл 15, 15:14    [17880283]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
а туплю возиться не надо, в функцию convert добавляем параметр стиля 1

INSERT INTO @tbl2 (ClientID, txtData, BinData)
  SELECT
        XmlData.value('/row[1]', 'INT'),
        XmlData.value('/row[3]', 'VARCHAR(max)'),
        CONVERT(VARBINARY(MAX), XmlData.value('/row[3]', 'VARCHAR(MAX)'), 1)
  FROM @tbl

/*
UPDATE T1
   SET [поле2] = x.BinData
  FROM TABLE1 T1
      JOIN @tbl2 T2 ON T2.ClientID = T1.[Поле1]
 WHERE T1.[Поле1] BETWEEN 45000 AND 48000
*/
11 июл 15, 15:22    [17880302]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13
felix_ff, немного запутался в последней части скрипта с названиями таблиц (что прописать).

К сообщению приложен файл. Размер - 139Kb
11 июл 15, 17:39    [17880563]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13
Я, наверное немного запутал. Задача: надо из txt файла обновить в таблице gk.GK_CARDS_EXT поле Extra, с привязкой по Card. Я просто не пойму, какие значения мне надо поставить в последней части запроса (UPDATE).
11 июл 15, 19:25    [17880784]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
oleg88rus,

oleg88rus,

что непонятного?

в интсрукции update меняете TABLE1 на свою таблицу и поле2 на нужное поле

для вашей таблицы инструкция будет такой:
begin transaction
UPDATE T1
   SET [extra] = x.BinData
  FROM gk.gk_cards_ext T1
      JOIN @tbl2 T2 ON T2.ClientID = T1.[card]
 WHERE T1.[card] BETWEEN 45000 AND 48000

--commit

в случае если количество обновленных строк вас устроит и результат
select * from gk.gk_cards_ext with(nolock) where card >= 45000 and card <= 48000

покажет правильный вариант делаете commit transaction
11 июл 15, 19:27    [17880791]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13
felix_ff,
извините, что напрягаю вас, но у меня пишет: "Недопустимое имя объекта "gk.gk_cards_ext". Чего-то я не так делаю...

К сообщению приложен файл. Размер - 149Kb
11 июл 15, 20:03    [17880861]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13
oleg88rus
felix_ff,
извините, что напрягаю вас, но у меня пишет: "Недопустимое имя объекта "gk.gk_cards_ext". Чего-то я не так делаю...

С этим разобрался, теперь пишет: "Не удалось привязать составной идентификатор "x.BinData"."
11 июл 15, 20:28    [17880944]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13
felix_ff,
если я не совсем наглею, могу я предоставить Вам удаленный доступ, чтобы Вы сами посмотрели в чем ошибка?
11 июл 15, 21:16    [17881064]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13
felix_ff,
я понимаю, что задаю совсем уж глупые вопросы, но подскажите хоть куда копать:
11 июл 15, 23:15    [17881389]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13


К сообщению приложен файл. Размер - 141Kb
11 июл 15, 23:16    [17881391]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
oleg88rus,

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

должно быть так:

begin transaction
UPDATE T1
   SET [extra] = T2.BinData
  FROM GK.GK_CARDS_EXT T1
      JOIN @tbl2 T2 ON T2.ClientID = T1.[card]
 WHERE T1.[card] BETWEEN 45000 AND 48000
12 июл 15, 00:35    [17881534]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
и два begin transaction там не к чему
12 июл 15, 00:36    [17881538]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13
felix_ff,

ОГРОМНОЕ Вам человеческое СПАСИБО. Вроде все получилось. Сегодня еще раз проверю на тестовой базе... Круто, вот так вот, без всякого редактирования исходного файла. Куда пиво засылать?
12 июл 15, 10:15    [17881930]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
oleg88rus
Member

Откуда:
Сообщений: 13
invm,

Вам тоже большое спасибо, что не бросили в беде. Думаю, что и Ваш запрос сработал-бы, просто там еще надо файл было редактировать...
12 июл 15, 10:18    [17881932]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля в таблице  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1446
oleg88rus
felix_ff,

ОГРОМНОЕ Вам человеческое СПАСИБО. Вроде все получилось. Сегодня еще раз проверю на тестовой базе... Круто, вот так вот, без всякого редактирования исходного файла. Куда пиво засылать?


всегда пожалуйста :)
13 июл 15, 04:29    [17883934]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить