2013-12-17 2 views
4

Я пишу хранимую процедуру для создания набора DELETE заявлений для администратора для запуска в базу данныхПостроить динамический список INSERT заявления значения

В рамках решения «откат», я хотел бы, для каждую строку, которую я собираюсь удалить, также создать отдельный оператор INSERT, чтобы пользователь, запускающий скрипт, хотел отменить, он может просто запускать операторы вставки в базе данных.

Мой вопрос: если я есть таблица с 8 столбцами (Col1..Col8), как я могу извлечь значения в списке, разделенном запятыми, для всех столбцов, чтобы в итоге я получил

INSERT INTO Table VALUES (Col1value, Col2value, ...Col8value) 

ответ

0

Вы можете создать таблицу temprory, а затем вставить дополнительную строку в свою процедуру, которая добавит эту строку в таблицу temprory. Когда человек хочет отменить, просто выберите последнюю строку таблицы (добавьте дополнительный столбец со временем или датой во время вставки) и вставьте эту строку в свою основную таблицу.

Надеюсь, это поможет.

+0

Спасибо, но мое требование - создать сценарий, который можно запускать изолированно. Поэтому я пытаюсь создать файл, который будет иметь в нем определенные инструкции INSERT, которые пользователь может выполнить, поэтому мне нужно вернуть список с разделителями-запятыми значений, возвращаемых SELECT * – Mike

6

Рассмотрим следующую команду:

SELECT 'SELECT ' + 
    STUFF ((
     SELECT ', [' + name + ']' 
     FROM syscolumns 
     WHERE id = OBJECT_ID('Table') AND 
      name <> 'me' 
     FOR XML PATH('')), 1, 1, '') + 
    ' FROM [Table]' 

Это будет строить SELECT заявление для конкретной таблицы. Чтобы построить INSERT заявления может выглядеть следующим образом:

SELECT @sql = 'INSERT INTO [Table] (' + 
    STUFF ((
     SELECT ', [' + name + ']' 
     FROM syscolumns 
     WHERE id = OBJECT_ID('Table') AND 
      name <> 'me' 
     FOR XML PATH('')), 1, 1, '') + 
    ') VALUES (' + 
    STUFF ((
     SELECT ', @' + name 
     FROM syscolumns 
     WHERE id = OBJECT_ID('Table') AND 
      name <> 'me' 
     FOR XML PATH('')), 1, 1, '') + ')' 

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

+0

. Спасибо @Michael - это дает мне имена столбцов для моего INSERT, но как мне получить значения в список, разделенный запятыми? – Mike

+0

@ Майк, я не уверен, потому что я не знаю, откуда берутся ценности. –

+0

хорошая точка и чтение моего вопроса назад, я не очень хорошо объяснил это. Значения представляют собой фактические значения из таблицы, в которой ваш код получает имена столбцов. В принципе, я хочу повернуть результаты SELECT * в список, разделенный запятыми, для вставки в «VALUES (xxx)» – Mike

0

Если вы нормально с помощью сторонних утилит, вы можете использовать SSMS Tools Pack

Это Microsoft SQL Management Server Studio (SSMS) надстройка для версий 2005, 2008, 2008 R2 и 2012.

Он может делать много вещей, включая: Сгенерировать инструкцию вставки для таблицы, представления или всей базы данных (см. Страницу функций: Insert statement generator).

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

2

Ожидая общего решения от других экспертов, приведена целесообразная версия, которая подходит, если структура таблицы известна и стабильна. Этот тест данные: -

create table #mytable (
    col1value varchar (50), 
    col2value int, 
    col3value decimal(10, 5), 
    col4value date, 
    col5value datetime 
); 

insert into #mytable values 
    (null,1,234.567,'2013-12-20','2013-01-07T17:30:24.567'), 
    ('def',null,987.645,'2013-12-21','2013-01-01'), 
    ('abc',17,null,'2013-12-20','2013-10-07T11:31:21.517'), 
    ('jkl',2,3232.32,null,'2013-01-01 01:02:03.456'), 
    ('mno',2,7.4006,'2012-07-04',null) 

Позволяет этот код: -

select 'insert into #myTable values (' + 
    isnull('''' + col1value + '''','null') + ',' + 
    isnull(convert(varchar(50),col2value),'null') + ',' + 
    isnull(convert(varchar(50),col3value),'null') + ',' + 
    isnull('''' + convert(varchar(50),col4value) + '''','null') + ',' + 
    isnull('''' + convert(varchar(50),col5value,121) + '''','null') + 
    ')' 
from #mytable 

Для производства: -

insert into #myTable values (null,1,234.56700,'2013-12-20','2013-01-07 17:30:24.567') 
insert into #myTable values ('def',null,987.64500,'2013-12-21','2013-01-01 00:00:00.000') 
insert into #myTable values ('abc',17,null,'2013-12-20','2013-10-07 11:31:21.517') 
insert into #myTable values ('jkl',2,3232.32000,null,'2013-01-01 01:02:03.457') 
insert into #myTable values ('mno',2,7.40060,'2012-07-04',null) 

Вы можете защитить от изменений структуры (в некоторой степени), включив столбец список в операциях insert. Даже со списком столбцов - если кто-то добавляет столбец с нулевым значением в таблицу без значения по умолчанию - ваши вставки будут терпеть неудачу (если вы не массируете их при изменении схемы).

Я бы ВСЕГДА использовал фабрику кода для создания такого кода (т.SP, который работает над информационной схемой, - которая использует типы столбцов для создания кода для сериализации каждого типа значения).

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

+0

Помогло мне, большое спасибо :) – Immu

Смежные вопросы