2010-09-21 67 views
5

有没有人知道一个proc或脚本会生成插入语句到同一个表中的任何行?有没有人知道proc将一行变成INSERT语句?

基本上,我想打电话像

exec RowToInsertStatement 'dbo.user', 45; 

而下面的代码将输出

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

我知道我可以

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

但这显然赢了没有用,因为ID列会抱怨(我希望它抱怨),并且没有办法只是覆盖那个c没有列出所有列的olumn,在一些表中可能有数百个。

那么,有没有人知道一个proc会为我写这个简单的插入?

编辑3:04:这样做的目的是这样我就可以使该行的副本,所以产生INSERT后,我可以修改成类似

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

..没有显然这个例子非常简单,没有任何意义,但是如果你有一个60列的表格,并且你需要的只是改变3或4个值,那么它开始变得很麻烦。

这有道理吗?

+0

我再次更新了我的答案! :) – 2010-09-21 19:39:06

回答

5

更新

我相信下面的动态查询是你想要什么:

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) 

更新2

,你想实际的事情:

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 

它是这样做的: 它生成insert语句,然后它查询表中的实际数据并使用该数据生成select语句。对于一些非常复杂的数据类型可能无法正确工作,但对于变种,日期时间和整数应该像魅力一样工作。

+0

感谢您的脚本。希望你不介意我做的一个调整。 – 2010-09-21 19:17:25

1

你知道吗,在企业管理器和SQL Server Management Studio中,你可以从对象浏览器中,拖动列的列表到文本窗口,它会将所有列的名称放入文本中,并用逗号分隔?

+0

我相信这里的问题是OP想要生成一个insert语句,其中一些样例数据已经通过select提供给它。你知道,我们都有这种懒惰。 – 2010-09-21 19:45:14

+0

是的,我知道,但说实话,我很少使用它,我完全忘了它。但事实告诉我,我宁愿只是调用一个proc,并生成它。 KWIM?谢谢你的回应,如果你坐在下一个立方体中,那正是我所做的。 – 2010-09-21 23:19:33

+0

@Denis我明白这个问题。我只是认为人们可能不知道这一点(因为我不知道它很长时间),并且对于任何懒得编写存储过程的人来说,至少他们可以跟这种技术一起跛行。 – ErikE 2010-09-22 00:18:43

相关问题