На мой взгляд, вы не можете сделать это с табличными функциями, потому что они нужны для статических объявлений таблиц. К сожалению, объявления ваших таблиц не совпадают. В результате вы не можете достичь этого с помощью табличных функций. В следующей хранимой процедуре, которая может помочь решить вашу проблему.
Эта хранимая процедура основана на следующих шагах;
- Создание сценария объявленной таблицы
- Созданиеглобальное временное, сформированное с той же структурой, что и объявленная таблица
- Заполнение исходных данных таблицы во временную таблицу
- Возвращение набора результатов временной таблицы
Примечание: В этом запросе используется хранимая процедура GetTableCreateScript для получения объявленного сценария создания таблицы.
РЕДАКТИРОВАНИЕ: STRING_AGG
удалено дляболее низкая версия SQL Server 2017 и добавлена XML PATH
для объединения строк.
DROP TABLE IF EXISTS TargetTable1
GO
CREATE TABLE TargetTable1 (Col1 INT , Deleted DATE)
GO
---Populating test data---
INSERT INTO TargetTable1 VALUES (1,GETDATE())
INSERT INTO TargetTable1 VALUES (2,NULL)
INSERT INTO TargetTable1 VALUES (3,GETDATE())
INSERT INTO TargetTable1 VALUES (4,NULL)
GO
CREATE OR ALTER PROC DynamicSQL
@TableName AS VARCHAR(200)
AS
DROP TABLE IF EXISTS ##TempDynamic
DECLARE @SQLDynamicTable AS VARCHAR(MAX)
DECLARE @SQLDynamicRows AS VARCHAR(MAX)
CREATE TABLE #DynamicSQL (S VARCHAR(MAX))
INSERT INTO #DynamicSQL
EXEC [dbo].GetTableCreateScript @TableName --->Generate Table Definition
---You can find GetTableCreateScript create script https://www.c-sharpcorner.com/blogs/generate-table-defination-in-sql-server-without-gui
--SELECT @SQLDynamicTable=REPLACE(STRING_AGG(S,' '),@TableName, '##TempDynamic') FROM #DynamicSQL ----->Create TempTable for SQL Server 2017 and upper version
SELECT @SQLDynamicTable=STUFF((
SELECT ' ' + s
FROM #DynamicSQL
FOR XML PATH('')
), 1, 1, '')
SET @SQLDynamicTable = REPLACE(@SQLDynamicTable,@TableName, '##TempDynamic')
PRINT @SQLDynamicTable
EXEC (@SQLDynamicTable)
SET @SQLDynamicRows = 'INSERT INTO ##TempDynamic SELECT * FROM ' + @TableName
EXEC(@SQLDynamicRows)
SELECT * FROM ##TempDynamic
WHERE Deleted IS NULL
GO
EXEC DynamicSQL 'TargetTable1'
+------+---------+
| Col1 | Deleted |
+------+---------+
| 2 | NULL |
| 4 | NULL |
+------+---------+