从函数或存储过程返回动态SQL表以在查询中使用

我有许多具有DATETIME类型的“已删除”字段的表,用于将记录标记为已删除(而不是完全删除它们)。

我经常发现自己要从这些表中请求数据,并希望排除已删除的记录。我现在正在做的事情是这样的:

SELECT A.* 
FROM (SELECT * FROM [TargetTable] WHERE (Deleted IS NULL)) AS A
WHERE (.........)

是否可能有一个存储过程/函数,我可以将表名传递给该存储过程/函数,并让已过滤的表返回?像这样:

SELECT A.*
FROM fnExcludeDeleted('MyTable') AS A
WHERE (.........)

我尝试使用表值函数执行此操作,但是根据我的收集,我需要定义结果表的列。我不能这样做,因为它并不总是与我使用该函数的表相同。

guoqia 回答:从函数或存储过程返回动态SQL表以在查询中使用

在我看来,您不能使用表值函数执行此操作,因为它们需要静态表声明。不幸的是,您的表声明不相同。结果,您无法借助表值函数来实现此目的。在下面的存储过程中可能会帮助您解决问题。

此存储过程基于以下步骤;

  1. 生成声明的表脚本
  2. 创建一个全局临时文件,该临时文件的结构与所声明的结构相同 桌子
  3. 将原始表数据填充到临时表
  4. 返回临时表的结果集

注意::此查询使用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

大家都在问