Как преобразовать запрос с разделением строк [разделение на несколько строк] в запрос таблицы обновления на сервере SQL? - PullRequest
0 голосов
/ 18 июня 2020

Очень новое в SQL. У меня есть запрос, который разбивает значение моего столбца на несколько строк. Теперь мне нужно привязать его к реальной таблице, а не только к просмотру через Select Query.

Я прочитал так много решений, и ни одно из них, похоже, не работает. Вся операция «создания функции разделения» записывает все эти сложные переменные, затем создает «временную таблицу», затем «объединяет ее обратно с исходной таблицей со столбцом значений» и так далее меня очень сбивает с толку. Может кто-нибудь, пожалуйста, просто изложите это в плане и в простом формате для меня. Должен быть более простой способ для таких нубов-разработчиков, как я. Пожалуйста, не говорите мне, что я делаю неправильно, и предполагайте, что я знаю, о чем вы говорите (потому что я знаю, что это не работает, я определил, что я не ПРО), может кто-нибудь, пожалуйста, просто покажите мне, что мне нужно сделать, чтобы эта работа работала.

У меня есть выходное представление, которое ТОЧНО то, что я хочу, но это просто представление, оно не обновляет таблицу .. Я просто хочу, чтобы вывод VALUE из моего запроса Split_String вставлялся в мою фактическую таблицу, или даже если я могу просто обновить таблицу, чтобы она выглядела как моя таблица запроса представления, или даже как я создаю новую таблицу из моего запроса, чтобы АКТУАЛЬНЫЙ таблица выглядит как мой запрос, а не просто представление, это было бы здорово!

ПРИМЕР ТАБЛИЦЫ из 1 строки

обратите внимание, что это только пример и в фактической таблице более 120 столбцов, и разделение строки [DOS File] не является моей проблемой (я сделал это с помощью моего запроса, который разбивается на разделитель и вставляется в несколько строк и дублирует все другие столбцы aro und it), моя проблема заключается в попытке зафиксировать столбец значений, созданный запросом split_string, в фактическую таблицу, чтобы я мог выполнять другие преобразования данных на нем, что требует, чтобы строка была разделена на разделитель

Имя Столбца 1 = Файл DOS

Значение Столбца 1 = example1.do c | example2.do c | example3.do c | example4.do c | example5.do c | example6.do c | example7.do c

Имя столбца 2 = ИМЯ

Значение столбца 2 = Салли Эндрюс

Имя столбца 3 = АДРЕС

Значение Column3 = 42 Wallaby Way, Syndey

Имя Column4 = НОМЕР ТЕЛЕФОНА

Значение Column4 = 123-123

Мой запрос Split_String, который имеет [Выходной столбец] моего запроса Split_String, прикрепленный ко всем другим столбцам в указанной таблице:

select value as [New DOS file], [Document Export Edit].*
from [Document Export Edit]
cross apply string_split([DOS file], '|')

Столбец [DOS file] является МАССИВНЫМ .csv style string, и поэтому разделителем будет '|'.

Методы, которые у меня есть пытался использовать:

Update [Document Export Edit]
 set [New DOS File] = (select value
from [Document Export Edit]
cross apply string_split([DOS file], '|'))
GO

Со следующим сообщением об ошибке:

Недопустимое имя столбца 'Новый файл DOS '.

и это:

Update [Document Export Edit]
      set [New DOS File] = replace([New DOS File],[New DOS File],
             select value from [Document Export Edit]
      cross apply string_split([DOS file], '|'))

Со следующим сообщением об ошибке:

Неверное имя столбца «Новый файл DOS».

и t his:

Alter Table [Document Export Edit]
Add [New DOS File] NVARCHAR(max) null
Add [Test] NVARCHAR(max) null
GO

Update [Document Export Edit]
set [New DOS File] = id1,
    [Test] = id2
from (
  select [DOS File],
          (select top 1 value as val
              from string_split([DOS File], '|')
              order by (row_number() over(order by 1 asc)) asc
              ) as id1,
          (select top 1 value as val
              from string_split([DOS File], '|')
              order by (row_number() over(order by 1 asc)) desc
              ) as id2
              from [Document Export Edit]
      ) A inner join [Document Export Edit] B
      on A.[DOS File] = B.[DOS File]

со следующим сообщением об ошибке:

Оконные функции, агрегаты и СЛЕДУЮЩЕЕ ЗНАЧЕНИЕ ДЛЯ функций не поддерживают целочисленные индексы как выражения предложения ORDER BY.

Итак, я попробовал это:

Update [Document Export Edit]
set [New DOS File] = id1
from (
  select [DOS File],
          (select top 1 value as val
              from string_split([DOS File], '|')
              ) as id1
              from [Document Export Edit]
      ) A inner join [Document Export Edit] B
      on A.[DOS File] = B.[DOS File]

Результат :

Это сработало, но он просто разделил первый экземпляр разделителя, продублировал то же самое в другом столбце и просто проигнорировал остальную часть строки. ТАК БЛИЗКО!!! Я просто хочу, чтобы он делал то, что он делал в первом бите, и делал это для остальной части строки, но помещал его в разные строки PER DELIMITER INSTANCE !!

, поэтому пошел попробовать это:

Update [Document Export Edit]
set [New DOS File] = id1
from (
  select [DOS File],
          (select top 1 value as val
              from [Document Export Edit]
              cross apply string_split([DOS File], '|')
              ) as id1
              from [Document Export Edit]
      ) A inner join [Document Export Edit] B
      on A.[DOS File] = B.[DOS File]

Результат:

Затем было выпущено, что весь [New DOS file] столбец только что воспроизвел первый результат. Вернулся и посмотрел на свой синтаксис, а затем понял, что я наложил ограничение переменной только на первый экземпляр ... мой плохой . Итак, я пошел и изменил его.

Затем я попробовал это:

Update [Document Export Edit]
set [New DOS File] = id1
from (
  select [DOS File],
          (select value as val
              from [Document Export Edit]
              cross apply string_split([DOS File], '|')
              ) as id1
              from [Document Export Edit]
      ) A inner join [Document Export Edit] B
      on A.[DOS File] = B.[DOS File]

со следующим сообщением об ошибке:

Подзапрос вернул более одного значения. Это не разрешено, если подзапрос следует за =,! =, <, <=,>,> = Или когда подзапрос используется как выражение.

Таким образом, похоже, что этот конкретный запрос может только делайте по одной переменной за раз, а не по нескольку строк одновременно.

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

Преобразование строки, разделенной запятыми, в отдельные строки

Разделение значений с разделителями в столбце SQL на несколько строк

Разделение данных столбца на несколько строк

Разделение значений на несколько строк

Обновление нескольких строк на SQL сервере с помощью предложения IN

Разделить строку на несколько строк с несколькими столбцами в паре

https://www.emoreau.com/Entries/Articles/2019/04/Splitting-a-value-into-multiple-rows-in-Microsoft-SQL-Server.aspx

Надеюсь, этой информации достаточно для кто-нибудь, пожалуйста, помогите мне. Спасибо.

1 Ответ

0 голосов
/ 18 июня 2020

После стольких часов попыток и потери надежды. Мой прекрасный друг Tech-Savy наконец указал, что у меня просто синтаксис был в неправильном порядке.

Ответ на мой вопрос был:

select value as [New DOS file], dbo.[Document Export Edit].*
into [Document Export String_Split]
from [Document Export Edit]
cross apply string_split([DOS file], '|')
...