我正在尝试在SQL Server中创建一个ANOVA F-Test存储过程(纯粹从概念角度来看 - 它是否可能?)
我遇到的最困难的事情是声明一个未指定数量的变量。我希望我的用户能够指定不确定数量的列来执行测试。以下是我的proc设置到目前为止:
CREATE PROCEDURE dbo.ANOVA
@ColumnList nvarchar(MAX),
@table nvarchar(MAX),
@null varchar(5) = 'eq'
AS
BEGIN
CREATE TABLE #columns (col varchar(250))
INSERT INTO #columns SELECT ItemValue FROM dbo.SplitList(@ColumnList, ',')
--SplitList is a table-valued function that splits a comma delimited list into a table.
DECLARE @NumVars int, @i int = 0, @TotMean float, @SQL nvarchar(MAX)
SELECT @NumVars = COUNT(*) FROM #columns
END
这只是我到目前为止的骨架。在我看来,我有两种方法可以解决这个问题。
使用Dynamic SQL声明变量并在一个Dynamic SQL语句中执行整个ANOVA过程:
SELECT @SQL =
'WHILE ' + CAST(@i AS varchar(50)) + ' < ' + CAST(@NumVars AS varchar) + '
BEGIN
DECLARE @a' + CAST(@i AS varchar(5)) + ' varchar(50)
DECLARE @a' + CAST(@i AS varchar(5)) + 'mean varchar(50)
@i = @1 +1
END
/* ANOVA stuff goes here */'
EXEC (@SQL)
或者使用动态SQL将变量声明到表中并从那里使用它们:
IF OBJECT_ID('tempdb..#vars') IS NOT NULL
DROP TABLE #vars
CREATE TABLE #vars (vars varchar(250))
SELECT @SQL =
'WHILE ' + CAST(@i AS varchar(50)) + ' < ' + CAST(@NumVars AS varchar) + '
BEGIN
INSERT INTO #vars VALUES(''@a' + @i +''')
@i = @i + 1
END
'
EXEC (@SQL)
--Declare means, do ANOVA stuff
我觉得完成这部分工作将是进行ANOVA程序最难的部分。我已经完成了单样本和双样本t检验,我觉得ANOVA是下一步。
我不是在找你们为我解决整个问题,只是为了开始,也许是一些如何使用这些变量的建议
答案 0 :(得分:0)
How about creating an XML (with variable # of columns) and pass it to the Stored Procedure and Handle the XML inside the Stored Proc.