2010-09-21 10 views
5

Kennt jemand einen Proc oder ein Skript, das irgendeine Reihe in eine Einfügungserklärung in die gleiche Tabelle erzeugt?Kennt jemand einen Prozess, um eine Zeile in eine INSERT-Anweisung umzuwandeln?

Grundsätzlich würde Ich mag, etwas nennen wie

exec RowToInsertStatement 'dbo.user', 45; 

Und der folgende Code auszugebenden

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

Ich weiß, ich kann

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

Aber dies offenbar gewonnen Es funktioniert nicht, weil die ID-Spalte sich beschweren wird (ich hoffe, dass sie sich beschwert) und es gibt keine Möglichkeit, diese einfach zu überschreiben. c olumn, ohne alle Spalten aufzulisten, und in einigen Tabellen könnte es Hunderte geben.

Also, weiß jemand von einem Proc, der diesen einfachen Einsatz für mich schreiben wird?

EDIT 03.04: Der Zweck dieser ist, so kann ich eine Kopie der Zeile machen, so dass nach der INSERT erzeugt wird, ich es in so etwas wie

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

.. nein Offensichtlich ist dieses erfundene Beispiel so einfach, dass es keinen Sinn ergibt, aber wenn Sie eine Tabelle mit 60 Spalten haben und alles, was Sie brauchen, um 3 oder 4 Werte zu ändern, dann beginnt es, ein Aufwand zu sein.

Macht das Sinn?

+0

Ich habe meine Antwort noch einmal aktualisiert! :) –

Antwort

5

aktualisieren

Ich glaube, die folgende dynamische Abfrage ist, was Sie wollen:

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) 

Update 2

Die eigentliche Sache, die man wollte:

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 

Was es tut, ist dies: Es generiert die insert-Anweisung und dann fragt es die tatsächlichen Daten aus der Tabelle ab und generiert die select-Anweisung mit diesen Daten. Funktioniert möglicherweise nicht korrekt für einige wirklich komplexe Datentypen, aber für Varchare sollten Datumsangaben und Ints wie ein Zauber wirken.

+0

Danke für das Skript. Ich hoffe, es macht dir nichts aus, dass ich eine Änderung vorgenommen habe. –

1

Wussten Sie, dass in Enterprise Manager und SQL Server Management Studio, die Sie aus dem Objekt-Browser, die Liste der Spalten in den Text ziehen Fenster und es werden die Namen aller Spalten in den Text, durch Kommata getrennt?

+0

Ich glaube, das Problem hier ist, dass das OP will eine Insert-Anweisung mit einigen Beispieldaten bereits über eine Auswahl geliefert werden. Weißt du, diese Faulheit, die wir alle haben. –

+0

Ja, das weiß ich, aber um ehrlich zu sein, benutze ich es so selten, dass ich es komplett vergessen habe. Aber ehrlich gesagt, würde ich es vorziehen, einfach einen Proc aufzurufen und ihn zu generieren. KWIM? Danke für die Antwort, und wenn Sie im nächsten Würfel sitzen würden, wäre das genau das, was ich getan hätte. –

+0

@Denis Ich habe das Problem verstanden. Ich dachte nur, dass die Leute das vielleicht nicht wissen (da ich es lange nicht kannte) und für jeden, der zu faul ist, eine gespeicherte Prozedur zu schreiben, können sie zumindest mit dieser Technik hinken. – ErikE

Verwandte Themen