A)到目前为止我的方式:
sqlCommand.CommandText =
"INSERT Table1 ([column1],[column2],[column3])" +
" SELECT [column1],[column2],[column3]" +
" FROM Table1 WHERE Id =" + param +
";select scope_identity() as id";
B)我希望做这样的事情:
INSERT INTO "table1" (* (without the ID-column))
SELECT (* (without the ID-column))
FROM "table1"
注意:我正在复制到同一张桌子。我只是想轻松地将它全部复制到另一行,而当然为新行提供一个新的ID。
这是一种好的做法,是否可能?
答案 0 :(得分:5)
执行此操作的唯一方法是列出第一个示例中的所有列。没有像SELECT *, -Id
您应该使用参数化SQL来进行SQL注入和计划缓存。
答案 1 :(得分:5)
我自己也有同样的问题,想要一个简单明了的方法。
我找到了允许这样做的解决方案here。我稍微修改了它以删除输出ID,并使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