У меня была та же проблема, и я хотел хороший и простой способ сделать это.
Я нашел решение здесь , которое позволяет это.Я немного изменил его, чтобы удалить выходной идентификатор, а также чтобы в качестве значения по умолчанию для IdColumnName было указано «Id».
IF OBJECT_ID('TableRowCopy') IS NOT NULL DROP PROCEDURE TableRowCopy
GO
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TableRowCopy](
@TableName VARCHAR(50),
@WhereIdValue INT,
@IdColumnName VARCHAR(50) = 'Id'
)
AS
BEGIN
DECLARE @columns VARCHAR(5000), @query VARCHAR(8000);
SET @query = '' ;
SELECT @columns =
CASE
WHEN @columns IS NULL THEN column_name
ELSE @columns + ',' + column_name
END
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (
TABLE_NAME = LTRIM(RTRIM(@TableName))
AND
column_name != LTRIM(RTRIM(@IdColumnName))
);
SET @query = 'INSERT INTO ' + @TableName + ' (' + @columns + ') SELECT ' + @columns + ' FROM ' + @TableName + ' WHERE ' + @IdColumnName + ' = ' + CAST(@WhereIdValue AS VARCHAR);
EXEC (@query);
SELECT SCOPE_IDENTITY();
END
Пример использования:
EXEC TableRowCopy 'MyTable', 3