首页 > 解决方案 > 在 SQL 函数中使用表名作为参数 (bis)

问题描述

更新:我解决了这个问题。显然我重新发明了轮子,但我没有立即找到我搜索的答案。

鉴于还有另一个问题与我的完全相同,但这并不能回答我的问题,我会尽量说清楚。我的问题没有得到回答,因为答案并不表明如何完成我的任务。我真的不在乎我如何完成它,但必须有办法。

我希望能够按任意表中任意两个离散列的级别计算出现次数。我想存储结果以供以后参考,因为查询需要很长时间才能运行。

表名和两个列名应该是可定义的。

根据大量研究,似乎应该使用一个函数,而不是一个过程,但我更感兴趣的是发生了什么,而不是它是如何发生的。

DROP FUNCTION IF EXISTS O_E_1
GO
DROP TABLE IF EXISTS TestTable
GO

CREATE FUNCTION O_E_1
    (@feature NVARCHAR(128), @table NVARCHAR(128))
RETURNS TABLE
AS
   RETURN
       (SELECT 
            COUNT(DISTINCT [PersonID]) AS count_person, 
            @feature AS feature, [HasT2DM] AS target
        FROM
            dbo.@table
        GROUP BY
            [@feature], [HasT2DM]);
GO

SELECT * 
INTO TestTable 
FROM  O_E_1('Diagnosis', 'PatientDiagnoses')
go

我希望通过一点点工作,我可以做到这一点。

我有一个版本在使用动态 SQL 的过程中执行此操作,但不幸的是,我看不到如何将该结果保存到表中。如果有人想告诉我如何将动态 SELECT 的结果保存到我的架构中的表中,那将完成我所需要的。

这是带有动态 SQL 的过程版本。还包括我如何尝试将结果存储到表中。

BEGIN

SET NOCOUNT ON;
DECLARE @cmd NVARCHAR(max)

set @cmd = '
       (SELECT 
            COUNT(DISTINCT [PersonID]) AS count_person, 
            [' + @feature + '] AS feature, [HasT2DM] AS target
        FROM
            dbo.[' + @table + ']
        GROUP BY
            [' + @feature + '], [HasT2DM])
            '
EXEC sp_executesql @cmd
END
GO

 O_E_1 @feature = 'Diagnosis', @table = 'PatientDiagnoses'

SELECT * 
INTO TestTable 
FROM  (O_E_1 @feature = 'Diagnosis', @table = 'PatientDiagnoses')
GO

我能够编写我需要的答案。这里是。

DROP PROCEDURE IF EXISTS O_E_1
GO
DROP TABLE IF EXISTS TestTable
GO

CREATE PROCEDUre O_E_1

@feature NVARCHAR(128),
 @table NVARCHAR(128)

AS

BEGIN

SET NOCOUNT ON;
DECLARE @cmd NVARCHAR(max)

set @cmd = '
       (SELECT 
            COUNT(DISTINCT [PersonID]) AS count_person, 
            [' + @feature + '] AS feature, [HasT2DM] AS target
        FROM
            dbo.[' + @table + ']
        GROUP BY
            [' + @feature + '], [HasT2DM])
            '
EXEC sp_executesql @cmd
END
GO


 DROP TABLe IF EXISTS RESULT
 CREATE TABLE Result
 (count_person numeric,
  feature      varchar(128),
  target       varchar(128)
  )

INSERT Result EXEC O_E_1 @feature = 'Diagnosis', @table = 'PatientDiagnoses'

Select TOP 100 * FROM RESULT

标签: sql-serverfunctioncreate-table

解决方案


推荐阅读