2010-09-21 14 views
5

Czy ktoś wie o proc lub skrypcie, który wygeneruje dowolny wiersz w instrukcji wstawiania do tej samej tabeli?Czy ktoś wie o proc, aby włączyć wiersz do instrukcji INSERT?

Zasadniczo chciałbym nazwać coś takiego

exec RowToInsertStatement 'dbo.user', 45; 

I następujący kod byłoby wyjście

insert into dbo.MyTable(FirstName, LastName, Position) 
values('John', 'MacIntyre', 'Software Consultant'); 

Zdaję sobie sprawę, mogłem

insert into dbo.MyTable 
select * from dbo.MyTable where id=45; 

Ale to oczywiście wygrał działa, ponieważ kolumna ID będzie narzekać (mam nadzieję, że narzeka) i nie ma sposobu, aby po prostu przesłonić tę c olumn bez wyświetlania wszystkich kolumn, aw niektórych tabelach mogą być setki.

Czy ktoś wie o procrze, który napisze dla mnie tę prostą wstawkę?

EDIT 03:04: Celem jest to, aby można było wykonać kopię wiersza, więc po INSERT jest generowany, można zmodyfikować go w coś jak

insert into dbo.MyTable(FirstName, LastName, Position) 
values('Dave', 'Smith', 'Software Consultant'); 

.. no oczywiście ten wymyślony przykład jest tak prosty, że nie ma sensu, ale jeśli masz tabelę z 60 kolumnami, a wszystko, czego potrzebujesz, to zmienić 3 lub 4 wartości, wtedy zaczyna się kłopot.

Czy to ma sens?

+0

Zaktualizowałem ponownie swoją odpowiedź! :) –

Odpowiedz

5

Aktualizacja

wierzę następujące zapytanie dynamiczny, co chcesz:

declare @tableName varchar(100), @id int, @columns varchar(max), @pk varchar(20) 
set @tableName = 'MyTable' 
set @pk = 'id' 
set @id = 45 

set @columns = stuff((select ',['+c.name+']' [text()] from sys.tables t 
join sys.columns c on t.object_id = c.object_id 
where t.name = @tableName and c.name <> @pk for xml path('')),1,1,'') 

print 'insert into [' + @tableName + '] (' + @columns + ') 
select ' + @columns + ' 
from [' + @tableName + '] 
where ' + @pk + ' = ' + cast(@id as varchar) 

Aktualizacja 2

Rzeczywista rzeczą, którą chciał:

declare @tableName varchar(100), @id int, @columns nvarchar(max), @pk nvarchar(20), @columnValues nvarchar(max) 
set @tableName = 'MyTable' 
set @pk = 'id' 
set @id = 45 

set @columns = stuff((select ',['+c.name+']' [text()] from sys.tables t 
join sys.columns c on t.object_id = c.object_id 
where t.name = @tableName and c.name <> @pk for xml path('')),1,1,'') 

set @columnValues = 'set @actualColumnValues = (select' + 
stuff((select ','','''''' + cast(['+c.name+'] as varchar(max)) + '''''''' [text()]' [text()] 
from sys.tables t 
join sys.columns c on t.object_id = c.object_id 
where t.name = @tableName and c.name <> @pk for xml path('')),1,1,'') 
+ 'from [' + @tableName + '] 
where ' + @pk + ' = ' + cast(@id as varchar) 
+ 'for xml path(''''))' 

--select @columnValues 
declare @actualColumnValues nvarchar(max), @columnValuesParams nvarchar(500) 
SET @columnValuesParams = N'@actualColumnValues nvarchar(max) OUTPUT'; 
EXECUTE sp_executesql @columnValues, @columnValuesParams, @actualColumnValues OUTPUT; 
--SELECT stuff(@actualColumnValues, 1,1, '') 

declare @statement nvarchar(max) 
set @statement = 
'insert into [' + @tableName + '] (' + @columns + ') 
select ' + stuff(@actualColumnValues,1,1,'') 

print @statement 

Co to jest: Generuje instrukcję insert, a następnie wysyła zapytanie do rzeczywistych danych z tabeli i generuje instrukcję select z tymi danymi. Może nie działać poprawnie dla niektórych naprawdę złożonych typów danych, ale dla varcharów, datetimes i int powinno działać jak urok.

+0

Dzięki za scenariusz. Mam nadzieję, że nie masz nic przeciwko jednej poprawce, którą zrobiłem. –

1

Czy wiesz, że w Enterprise Manager i SQL Server Management Studio, które mogą z przeglądarki obiektu, przeciągnij listę kolumn w tekście okno i spowoduje usunięcie nazw wszystkich kolumn w tekście, oddzielonych przecinkami?

+0

Sądzę, że problem polega na tym, że OP chce wygenerować instrukcję wstawiania z przykładowymi danymi już dostarczonymi do niej za pomocą selekcji. Wiesz, to lenistwo, które wszyscy mamy. –

+0

Tak, wiem o tym, ale szczerze mówiąc, używam go tak rzadko, że zupełnie o nim zapomniałem. Ale prawdę mówiąc, wolałbym po prostu wywołać proc i wygenerować go. KWIM? Dzięki za odpowiedź, a jeśli siedziałeś w następnej kostce, to właśnie bym to zrobił. –

+0

@Denis Zrozumiałem problem. Po prostu myślałem, że ludzie mogą o tym nie wiedzieć (ponieważ nie wiedziałem o tym od dłuższego czasu) i dla każdego, kto jest zbyt leniwy, by napisać procedurę przechowywaną, przynajmniej oni mogą utykać razem z tą techniką. – ErikE

Powiązane problemy