有人知道将一行转换为INSERT语句吗?

时间:2010-09-21 18:52:30

标签: sql-server

是否有人知道proc或脚本会在插入语句中生成任何行到同一个表中?

基本上,我想打电话给

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列会抱怨(我希望它会抱怨)并且没有办法只覆盖那一列而不列出所有列,而在某些表中可能有数百列。

那么,是否有人知道将为我编写这个简单插入的proc?

编辑3:04 :这样做的目的是让我可以复制该行,所以在生成INSERT之后,我可以将其修改为类似

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

..显然这个人为的例子很简单,没有意义,但是如果你有一个包含60列的表,而你需要的只是改变3或4个值,那么它就开始变得麻烦了。

这有意义吗?

3 个答案:

答案 0 :(得分: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语句。对于某些非常复杂的数据类型可能无法正常工作,但对于varchars,datetimes和int应该像魅力一样工作。

答案 1 :(得分:2)

这个存储过程非常适合我:

http://vyaskn.tripod.com/code.htm#inserts

答案 2 :(得分:1)

您是否知道在Enterprise Manager和SQL Server Management Studio中,您可以从对象浏览器中将列列表拖到文本窗口中,它会将所有列的名称删除到文本中,以逗号分隔?