【发布时间】:2015-08-09 00:17:16
【问题描述】:
我想将一个表传递给 UDF 或存储过程,然后让它处理数据并从我传递给它的表中返回敏感度、特异性和 95% 上/下置信区间(对于每个)。
基本上,我需要从一个表中计算并返回六个值。
我必须这样做很多次,所以自动化会很棒,但我还没有创建 UDF 或 SP。我已经阅读了它们(stackoverflow 和其他地方,但被困在如何继续。
我创建了 SQL 部分来计算感兴趣的参数,但我真的很困惑如何将表传递给它并取出表。
DECLARE @R_MODS TABLE(
SUBJECTID varchar(max),
ResultCall varchar(max)
)
INSERT INTO @R_MODS VALUES ('11-0001','TP');
INSERT INTO @R_MODS VALUES ('11-0002','TP');
INSERT INTO @R_MODS VALUES ('11-0003','TP');
INSERT INTO @R_MODS VALUES ('11-0004','TP');
INSERT INTO @R_MODS VALUES ('11-0005','TP');
INSERT INTO @R_MODS VALUES ('11-0006','I');
INSERT INTO @R_MODS VALUES ('11-0007','TP');
INSERT INTO @R_MODS VALUES ('11-0008','TP');
INSERT INTO @R_MODS VALUES ('11-0009','I');
INSERT INTO @R_MODS VALUES ('11-0010','TP');
INSERT INTO @R_MODS VALUES ('11-0011','TP');
INSERT INTO @R_MODS VALUES ('11-0012','TN');
INSERT INTO @R_MODS VALUES ('11-0013','TP');
INSERT INTO @R_MODS VALUES ('11-0014','I');
INSERT INTO @R_MODS VALUES ('11-0015','TP');
INSERT INTO @R_MODS VALUES ('11-0016','TP');
INSERT INTO @R_MODS VALUES ('11-0017','TN');
INSERT INTO @R_MODS VALUES ('11-0018','TP');
INSERT INTO @R_MODS VALUES ('11-0019','FP');
INSERT INTO @R_MODS VALUES ('11-0020','FP');
DECLARE @TP float, @TN float, @FP float, @FN float, @SEN float, @SPE float, @M1 float,
@M2 float, @Sen95 float, @SpeL float , @SpeU float, @SenU float, @SenL float
SET @TP = (SELECT COUNT(SUBJECTID) FROM @R_MODS WHERE ResultCall='TP')
SET @TN = (SELECT COUNT(SUBJECTID) FROM @R_MODS WHERE ResultCall='TN')
SET @FP = (SELECT COUNT(SUBJECTID) FROM @R_MODS WHERE ResultCall='FP')
SET @FN = (SELECT COUNT(SUBJECTID) FROM @R_MODS WHERE ResultCall='FN')
SET @SEN = @TP/(@TP + @FN)
SET @M1 = @TP + @FN
SET @SPE = @TN/(@TN + @FP)
SET @M2 = @FP + @TN
SET @SenL = ( 2*@M1*@SEN + POWER(1.96,2) - 1 - 1.96 * SQRT(POWER(1.96,2)
- 2 -(1/@M1)+ 4*@SEN *(@M1*(1-@SEN) + 1)))/(2*(@M1+POWER(1.96,2)))
SET @SenU = ( 2*@M1*@SEN + POWER(1.96,2) + 1 + 1.96 * SQRT(POWER(1.96,2)
+ 2 -(1/@M1)+ 4*@SEN *(@M1*(1-@SEN) - 1)))/(2*(@M1+POWER(1.96,2)))
SET @SpeL = ( 2*@M2*@SPE + POWER(1.96,2) - 1 - 1.96 * SQRT(POWER(1.96,2)
- 2 -(1/@M2)+ 4*@SPE *(@M2*(1-@SPE) + 1)))/(2*(@M2+POWER(1.96,2)))
SET @SpeU = ( 2*@M2*@SPE + POWER(1.96,2) + 1 + 1.96 * SQRT(POWER(1.96,2)
+ 2 -(1/@M2)+ 4*@SPE *(@M2*(1-@SPE) - 1)))/(2*(@M2+POWER(1.96,2)))
SELECT @SEN, @SenL, @SenU, 1-@SPE, 1-@SPEL, 1-@SpeU
【问题讨论】:
-
如果你使用的是sql server 2008或以上版本,那么你可以定义一个用户定义的表类型并在存储过程中声明它的参数,以便传递表值
标签: sql sql-server stored-procedures user-defined-functions