Используя SQL Server 2008, я хотел бы дублировать одну строку таблицы, , не зная названия полей. Моя ключевая проблема: поскольку таблица растет и мутирует с течением времени, я бы хотел, чтобы этот скрипт-сценарий продолжал работать, без необходимости записывать 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
Это обходной путь, но я должен предположить, что это своего рода хак. –
Верно, но вы должны согласиться с тем, что он намного чище и удобнее в использовании, чем код в вопросе. Возможно, это взломать, но это взлом, который покупает вам более чистый код без недостатков (что я знаю, во всяком случае). –
«Легче следить» довольно субъективно, и я не согласен - я нахожу динамический SQL более интуитивным, чем создание какой-либо # компактной копии таблицы. И создание объекта в tempdb, даже если оно содержит только одну строку, может вызвать конфликт, который не возникает при чтении метаданных. Это может быть особенно актуально, если таблица широкая (например,LOB), и одна строка может не совпадать с одной страницей. –