在我看来,您不能使用表值函数执行此操作,因为它们需要静态表声明。不幸的是,您的表声明不相同。结果,您无法借助表值函数来实现此目的。在下面的存储过程中可能会帮助您解决问题。
此存储过程基于以下步骤;
- 生成声明的表脚本
- 创建一个全局临时文件,该临时文件的结构与所声明的结构相同
桌子
- 将原始表数据填充到临时表
- 返回临时表的结果集
注意::此查询使用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,'')
SET @SQLDynamicTable = REPLACE(@SQLDynamicTable,'##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 |
+------+---------+
本文链接:https://www.f2er.com/3152552.html