sql-server - 在 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
解决方案
推荐阅读
- unit-testing - 我应该如何处理使用 runtime.GOOS 的 Go 函数的测试?
- python - Flask 登录“current_user”会话已过期
- react-native - DatePicker 在 iOS react-native 0.60.6 中的工作非常奇怪
- processing - Processing.js:使用缓出停止加速
- sql - 如何插入通过外键引用另一个 postgres 表的行,如果它不存在也创建外行?
- git - 如何让 git 从目录中检测所有重命名的文件
- google-apps-script - 如何将大型数组拆分为较小的数组以进行批处理,以便 setValues() 不会超时?
- aws-lambda - 如何访问 AWS Lamba 中的 SQL 数据库?
- css - 如何在顺风中并排对齐组件
- python - 为什么 numbers.Real 没有 __gt__ 作为抽象(或默认)方法?