SQL Server 2008 を使用して、フィールド名を知らずにテーブルの 1 行を複製したいと考えています。私の重要な問題: テーブルが成長し、時間の経過とともに変化するにつれて、30 以上の変化し続けるフィールドを書き出さなくても、このコピー スクリプトが機能し続けることを望みます。
もちろん、IDENTITY フィールドをコピーできないことも問題です。
以下のコードは機能しますが、テキスト文字列を組み合わせた SQL ステートメントよりも適切な方法があるのでしょうか?
それではよろしくお願いします。これが私の(はい、動作する)コードです-改善に関する提案を歓迎します。トッド
alter procedure spEventCopy
@EventID int
as
begin
-- VARS...
declare @SQL varchar(8000)
-- LIST ALL FIELDS (*EXCLUDE* IDENTITY FIELDS).
-- USE [BRACKETS] FOR ANY SILLY FIELD-NAMES WITH SPACES, OR RESERVED WORDS...
select @SQL = coalesce(@SQL + ', ', '') + '[' + column_name + ']'
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'EventsTable'
and COLUMNPROPERTY(OBJECT_ID('EventsTable'), COLUMN_NAME, 'IsIdentity') = 0
-- FINISH SQL COPY STATEMENT...
set @SQL = 'insert into EventsTable '
+ ' select ' + @SQL
+ ' from EventsTable '
+ ' where EventID = ' + ltrim(str(@EventID))
-- COPY ROW...
exec(@SQL)
-- REMEMBER NEW ID...
set @EventID = @@IDENTITY
-- (do other stuff here)
-- DONE...
-- JUST FOR KICKS, RETURN THE SQL STATEMENT SO I CAN REVIEW IT IF I WISH...
select EventID = @EventID, SQL = @SQL
end