2010-09-21 39 views
5

Aynı tabloya bir insert ifadesinde herhangi bir satır oluşturacak bir proc veya script bilen var mı?Bir satırın INSERT ifadesine dönüştürülmesini isteyen bir kişi var mı?

Temelde, ben

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

olabilir gerçekleştirmek Ama bu besbelli kazandı ben

exec RowToInsertStatement 'dbo.user', 45; 

gibi bir şey aramak istiyorum Ve aşağıdaki kodu

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

çıkışı olacaktır işe yaramaz, çünkü ID sütunu şikayet eder (umarım şikayet eder) ve sadece bir c'yi geçersiz kılmanın bir yolu yoktur. Tüm sütunları listelemeden olumn ve bazı tablolarda yüzlerce olabilir.

Bu basit eklentiyi benim için yazacak bir prokumu bilen var mı?

DÜZENLEME 03:04: INSERT oluşturulur sonra ben

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

gibi bir şey içine değiştirebilir böylece bu amacı bu yüzden, sıranın bir kopyasını oluşturabilirsiniz edilir .. hayır Belli ki bu örnek, o kadar basit ki, mantıklı değil, ama eğer 60 sütun içeren bir tablonuz varsa ve ihtiyacınız olan tek şey 3 veya 4 değeri değiştirmekse, o zaman bir güçlük olmaya başlar.

Bu mantıklı mı?

+0

Cevabımı tekrar güncelledim! :) –

cevap

5

Güncelleme

aşağıdaki dinamik sorgu istediğini olduğuna inanıyorum:

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) 

Güncelleme istediğini 2

fiili şey:

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 

Bu nedir: insert deyimini oluşturur ve daha sonra gerçek verileri tablodan sorgular ve bu verilerle select deyimini oluşturur. Bazı gerçekten karmaşık veri türleri için doğru çalışmayabilir ancak varcharlar için, datetimes ve ints bir çekicilik gibi çalışmalıdır.

+0

Komut dosyası için teşekkürler. Umarım yaptığım bir tweak sakıncası yoktur. –

1

Enterprise Manager ve SQL Server Management Studio'da sen, nesne tarayıcıdan, metne sütunların listesini sürükleyebileceğinizi biliyor muydunuz Penceresi ve tüm sütunların isimlerini virgülle ayırarak metne bırakacak mı?

+0

Buradaki sorunun, OP'nin bir seçim yoluyla kendisine verilen bazı örnek verilerle bir ekleme ifadesi oluşturması gerektiğine inanıyorum. Bilirsin, hepimizin sahip olduğu bu tembellik şeyleri. –

+0

Evet, bunu biliyorum, ama dürüst olmak gerekirse, bunu çok nadiren kullanıyorum, onu tamamen unutmuşum. Ama gerçek söylenmeli, sadece bir proc çağırmayı ve onu üretmeyi tercih ederim. KWIM? Cevabınız için teşekkürler, ve bir sonraki küpde oturuyor olsaydınız, tam olarak ne yapardım. –

+0

@Denis Problemi anladım. İnsanların bunu bilmeyebileceğini düşündüm (bunu uzun zamandır bilmiyordum) ve saklı bir prosedürü yazmak için fazla tembel olan herkes için en azından bu teknikle uzayabilirler. – ErikE

İlgili konular