我想克隆具有单个主键(PrimKey)多个表行。 什么是克隆在SQL Server 2005中的行的最快方法是什么?
下面是一个例子,
克隆PrimKey1得到PrimKey2。 所以我尝试以下方法:
INSERT INTO PrimKeys
SELECT 'PrimKey2' AS PrimKey,*
FROM PrimKeys
WHERE PrimKey='PrimKey1'
但当然,这里的问题是,列PrimKey被重复内SELECT语句。 是否有任何其他方式在简洁上述相似?
谢谢大家的响应。 我继续写的处理,在我的应用程序的功能。 所以我不能使用几个张贴你们中的一些有效的答案我不使用存储的特效或临时表。
如果您是从多个表克隆,以最快的方式将是使用存储过程,让所有的查询留在数据库上,你不付出代价的客户端和服务器之间的通信。
一旦你这样做,然后开始单元测试,看看需要多长时间的运做。 然后开始改变它,根据你的建议尝试,看看你得到任何改善。
您可以运行类似下面的存储过程来避免输入了所有的列名。 下面的例子假设一个int,但你可以交换密钥类型出来的任何数据类型。
create procedure [CloneRow]
@tableName varchar(max),
@keyName varchar(max),
@oldKeyId int,
@newTableId int output
as
declare @sqlCommand nvarchar(max),
@columnList varchar(max);
select @columnList = coalesce(@columnList + ',','') + sys.columns.name
from sys.columns
where object_name(sys.columns.object_id) = @tableName
and sys.columns.name not in ( @keyName )
and is_computed = 0;
set @sqlCommand = 'insert into ' + @tableName + ' ( ' + @columnList + ') (' +
'select ' + @columnList + ' from ' + @tableName + ' where ' + @keyName + ' = @oldKeyId )'
exec sp_executesql @sqlCommand, N'@oldKeyId int', @oldKeyId = @oldKeyId
select @newTableId = @@identity -- note scope_identity() won't work here!
GO
你这样称呼它:
declare @newOrderId int
exec [CloneRow] 'orderTable', 'orderId', 625911, @newOrderId output
这不是最漂亮的解决方案,但我认为它会为你工作。 首先,你有一个“新”的主键选择您的数据到一个临时表中,下次你从临时表中删除旧的主键列,并使用临时表中插入你的“克隆”行。
SELECT
'PrimKey2' AS NewPrimKey,
*
INTO #TMP
FROM PrimKeys
WHERE PrimKey='PrimKey1';
ALTER TABLE #TMP DROP COLUMN PrimKey;
INSERT INTO PrimKeys
SELECT * FROM #TMP;
首先,如果你需要对大量的表,那么动态SQL和系统表执行一般操作是你的朋友。
简短的说,哈坎的解决方案将非身份的PK合作。 我想起来拧紧到:
SELECT * INTO #TMP
FROM PrimKeys
WHERE PrimKey='PrimKey1';
UPDATE #TMP SET PrimeKey = 'PrimeKey2';
INSERT INTO PrimKeys
SELECT * FROM #TMP;
对于身份的PK,更改上面的DROP COLUMN的UPDATE:
SELECT * INTO #TMP
FROM PrimKeys
WHERE PrimKey=101;
ALTER TABLE #TMP DROP COLUMN PrimeKey;
INSERT INTO PrimKeys
SELECT * FROM #TMP;
不知道你是什么意思“多个表行有一个主键”的意思。
PRIMARY KEY
,顾名思义,是UNIQUE
。
做你的查询,你需要枚举所有列:
INSERT
INTO PrimKeys (PrimKey, col1, col2, …)
SELECT 'PrimKey2' AS PrimKey, col1, col2, …
FROM PrimKeys
WHERE PrimKey = 'PrimKey1'