gpt4 book ai didi

sql-server - 有人知道将一行转换为 INSERT 语句的过程吗?

转载 作者:行者123 更新时间:2023-12-02 23:11:13 24 4
gpt4 key购买 nike

有人知道一个过程或脚本可以在同一个表的插入语句中生成任何行吗?

基本上,我想调用类似的东西

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

那么,有人知道有一个程序可以为我编写这个简单的插入吗?

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

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

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

这有意义吗?

最佳答案

更新

我相信以下动态查询就是您想要的:

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 语句。对于某些非常复杂的数据类型可能无法正常工作,但对于 varchar、日期时间和整数应该可以正常工作。

关于sql-server - 有人知道将一行转换为 INSERT 语句的过程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3763461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com