Вы можете построить запрос динамически.Я не думаю, что это особенно изящное решение, но оно бы сработало:
DECLARE @TableName VARCHAR(100),
@FlagColumn VARCHAR(100)
SET @TableName = 'TestTable'
SET @FlagColumn = 'FlagColumn'
-- BUILD THE TEMPORARY TABLE
DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'SELECT * INTO ##' + @TableName + ' FROM ' + @TableName
EXEC(@SQL)
-- DO STUFF
-- BUILD SQL FOR MERGE STATEMENT
SET @SQL = ''
SELECT @SQL = @SQL + ' AND main.' + COLUMN_NAME + ' = temp.' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME != @FlagColumn
SET @SQL = 'MERGE INTO ' + @TableName + ' main USING ##' + @TableName + ' temp ON ' + STUFF(@SQL, 1, 5, '') +
' WHEN MATCHED THEN UPDATE SET ' + @FlagColumn + ' = 1;'
-- EXECUTE MERGE STATEMENT
EXEC (@SQL)
-- DROP TEMP TABLE
SET @SQL = 'DROP TABLE ##' + @TableName
EXEC (@SQL)
Это более динамично, чем необходимо, и его можно упростить, поскольку ни один из временных элементов таблицы не должен выполняться динамическиЯ только что сделал это, потому что я не знаю имен вашей таблицы или имени вашей временной таблицы.
Я проверил это, создав следующую таблицу:
CREATE TABLE TestTable (FlagColumn BIT)
DECLARE @i INT = 1
DECLARE @SQL VARCHAR(MAX)
WHILE @i < 100
BEGIN
SET @SQL = 'ALTER TABLE TestTable ADD COLUMN' + CONVERT(VARCHAR, @i) + ' INT'
EXEC (@SQL)
SET @i = @i + 1
END