gpt4 book ai didi

sql - 在同一个表中复制一行

转载 作者:太空狗 更新时间:2023-10-30 01:45:09 25 4
gpt4 key购买 nike

给定以下 SQL(MS SQL 2008):

SET IDENTITY_INSERT MyTable ON
GO
INSERT INTO MyTable
SELECT * FROM MyTable
WHERE Id = @SomeId
GO
SET IDENTITY_INSERT MyTable OFF

这导致:只有在使用列列表且 IDENTITY_INSERT 为 ON 时,才能指定表“MyTable”中标识列的显式值。

那么,我真的需要定义一个列列表吗?有没有办法保持它的通用性?例如。如果以后开发者添加了一个列,这个列就不会进入这个例程,如果不允许为 null 甚至会失败...

最佳答案

嗯,实际上有一个更通用的方法,在不知道列的情况下也能很好地工作:

DECLARE @Tablename NVARCHAR(255) = 'MyTable'
DECLARE @IdColumn NVARCHAR(255) = 'MyTableId' -- Primarykey-Column, will be ignored
DECLARE @IdToCopyFrom VARCHAR(255) = '33' -- Copy from this ID

DECLARE @ColName NVARCHAR(255)
DECLARE @SQL NVARCHAR(MAX) = ''

DECLARE Table_Cursor CURSOR FOR
SELECT [B].[Name]
FROM SYSOBJECTS AS [A], SYSCOLUMNS AS [B]
WHERE [A].[ID] = [B].[ID] AND A.name = @Tablename

OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @ColName
WHILE (@@FETCH_STATUS = 0)
BEGIN
-- Loop through all columns and link them into the Sql-string (except the PK-column)
DECLARE @SkipComma BIT = 0
IF (@ColName <> @IdColumn)
SET @SQL = @SQL + @ColName
ELSE
SET @SkipComma = 1
FETCH NEXT FROM Table_Cursor INTO @ColName
IF (@SkipComma = 0 AND @@FETCH_STATUS = 0)
SET @SQL = @SQL + ','
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor

SET @SQL = 'INSERT INTO ' + @Tablename + '(' + @SQL + ')' +
' SELECT ' + @SQL + ' FROM ' + @Tablename +
' WHERE ' + @IdColumn + ' = ' + @IdToCopyFrom
PRINT @SQL
EXEC(@SQL)

干杯!

关于sql - 在同一个表中复制一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6439638/

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