SQL Server - 声明动态数量的变量(ANOVA)

时间:2016-04-15 13:49:22

标签: sql-server tsql anova

我正在尝试在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是下一步。

我不是在找你们为我解决整个问题,只是为了开始,也许是一些如何使用这些变量的建议

1 个答案:

答案 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.