T-SQL вставляет объемный текст из Select - PullRequest
1 голос
/ 03 февраля 2011

В SQL Server 2008 у меня есть оператор выбора, который плюет ниже текстового вывода.

'text1d', 'text2', 'text3'

'text3d', 'text2', 'text6'

'text1d', 'text2', 'text6'

'text18d', 'text2', 'text3

' text15 ',' text2 ',' text5 '

.....

.....

Я хочу вставить вышеуказанный вывод в таблицу Test1.

create table Test1  (c1 varchar(20),c2 varchar(20),c3 varchar(20))

Я могу вместо этого изменить скрипт выбора, который генерирует вывод выше, чем-то другим«одинарные кавычки» и «запятая», если это помогает.

Спасибо.

Ответы [ 4 ]

1 голос
/ 04 февраля 2011

Не очень оптимизировано, но, вероятно, работает:

DECLARE @values VARCHAR(MAX)
DECLARE c_select CURSOR FAST_FORWARD FOR
SELECT <your statement here>
OPEN c_select
FETCH NEXT FROM c_select INTO @values
WHILE @@FETCH_STATUS = 0
BEGIN
   EXEC('INSERT INTO table2 (col1, col2, col3) VALUES (' + @values + ')')
   FETCH NEXT FROM c_select INTO @values
END
CLOSE c_select
DEALLOCATE c_select
0 голосов
/ 04 февраля 2011

Вы можете заставить свой regexp func возвращать xml. Вместо этого 'text1d','text2','text3' вы можете построить это <v>text1d</v><v>text2</v><v>text3</v>.

Вот пример с табличной переменной, имитирующей ваш запрос.

Настройка тестовых данных

declare @T table (txt varchar(50))

insert into @T values ('<v>text1d</v><v>text2</v><v>text3</v>')
insert into @T values ('<v>text3d</v><v>text2</v><v>text6</v>')
insert into @T values ('<v>text1d</v><v>text2</v><v>text6</v>')
insert into @T values ('<v>text18d</v><v>text2</v><v>tex3t</v>')
insert into @T values ('<v>text15</v><v>text2</v><v>text5</v>')

Ваш запрос должен вернуть то, что сейчас находится в @ T

txt
<v>text1d</v><v>text2</v><v>text3</v>
<v>text3d</v><v>text2</v><v>text6</v>
<v>text1d</v><v>text2</v><v>text6</v>
<v>text18d</v><v>text2</v><v>tex3t</v>
<v>text15</v><v>text2</v><v>text5</v>

Вот инструкция вставки, которая запрашивает xml в @ T.txt для столбцов.

insert into Test1 (c1, c2, c3)
select
  cast(txt as xml).value('v[1]', 'varchar(20)'),
  cast(txt as xml).value('v[2]', 'varchar(20)'),
  cast(txt as xml).value('v[3]', 'varchar(20)')
from @T 

Запрос к Test1 даст вам этот результат.

c1      c2    c3
text1d  text2 text3
text3d  text2 text6
text1d  text2 text6
text18d text2 tex3t
text15  text2 text5

Полагаю, это тоже ответ на этот вопрос. Вставить в SQL-сервер из возвращаемого текста регулярного выражения

0 голосов
/ 04 февраля 2011

Зачем объединять столбцы в строку с разделителями только для повторного анализа для вставки?

Разве вы не можете просто:

insert into Test1
    (c1, c2, c3)
    <variation of your original select>
0 голосов
/ 04 февраля 2011
INSERT INTO "table1" ("column1", "column2", ...)
SELECT "column3", "column4", ...
FROM "table2"
...