Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Najszybszy sposób na klonowanie wiersza w SQL

Możesz uruchomić coś podobnego do poniższej procedury składowanej, aby uniknąć wpisywania wszystkich nazw kolumn. Poniższy przykład zakłada int, ale możesz zamienić typ klucza na dowolny typ danych.

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

Nazywasz to tak:

declare @newOrderId int
exec [CloneRow] 'orderTable', 'orderId', 625911, @newOrderId output


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Indeksy klastrowe w kolumnach bez tożsamości, aby przyspieszyć wstawianie zbiorcze?

  2. Programowe tworzenie pliku bazy danych SQL Server CE

  3. Jaki jest najlepszy sposób automatycznego generowania instrukcji INSERT dla tabeli programu SQL Server?

  4. Czy pojedyncza instrukcja SQL Server jest niepodzielna i spójna?

  5. Łączenie wielu wierszy w jeden i dołączanie kolumn w zależności od liczby wierszy