Sql 将表变量传递给存储过程

Sql 将表变量传递给存储过程,sql,sql-server,ssms,Sql,Sql Server,Ssms,我试图创建一个过程,我可以传递一个单列表,该过程将输出中位数。现在我有一个程序来确定中位数;但是,我得到的错误是@table变量尚未声明,并且无法找到存储过程 我的程序: CREATE OR ALTER PROCEDURE dbo.median (@table NUMERIC, @median FLOAT OUTPUT) AS DECLARE @size AS NUMERIC SET @size = (SELECT COUNT(*) FROM @table)

我试图创建一个过程,我可以传递一个单列表,该过程将输出中位数。现在我有一个程序来确定中位数;但是,我得到的错误是@table变量尚未声明,并且无法找到存储过程

我的程序:

CREATE OR ALTER PROCEDURE dbo.median
    (@table NUMERIC, 
     @median FLOAT OUTPUT)
AS 
    DECLARE @size AS NUMERIC
    SET @size = (SELECT COUNT(*) FROM @table)

    SET @median = (SELECT AVG(1) FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY 1) AS ROW FROM @table) AS subquery
        WHERE subquery.ROW = ROUND(@size / 2, 0) OR subquery.ROW = ROUND(@size / 2, 0, 1))
    RETURN
GO
DECLARE @Arsenic TABLE(Ar FLOAT)
INSERT INTO @Arsenic SELECT Arsenic from dbo.HubspotWaterTestAverages

EXEC dbo.median (SELECT Arsenic FROM dbo.HubspotWaterTestAverages)
调用过程:

CREATE OR ALTER PROCEDURE dbo.median
    (@table NUMERIC, 
     @median FLOAT OUTPUT)
AS 
    DECLARE @size AS NUMERIC
    SET @size = (SELECT COUNT(*) FROM @table)

    SET @median = (SELECT AVG(1) FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY 1) AS ROW FROM @table) AS subquery
        WHERE subquery.ROW = ROUND(@size / 2, 0) OR subquery.ROW = ROUND(@size / 2, 0, 1))
    RETURN
GO
DECLARE @Arsenic TABLE(Ar FLOAT)
INSERT INTO @Arsenic SELECT Arsenic from dbo.HubspotWaterTestAverages

EXEC dbo.median (SELECT Arsenic FROM dbo.HubspotWaterTestAverages)
注:砷代表水测试的砷水平结果,数值范围为零到10


工作过程只需返回列的中值,稍后我计划将其交叉连接到主表。谢谢你的帮助

这可能会有所帮助。除表变量外,必须使用表类型

CREATE TABLE Employee 
(  
EmpId int NOT NULL,  
EmployeeName nvarchar(MAX),  
)
GO

CREATE TYPE EmployeeType AS TABLE  
(  
EmpId int NOT NULL,  
EmployeeName nvarchar(MAX)  
)
GO


如果要传递表值参数,必须首先定义自定义表类型。文件中对此进行了概述。试试看:在存储过程中使用表值参数的尝试与我见过的任何示例都不一样。在SQL Server 2012及更高版本上,
PERCENTILE_DISC(0.5)
将计算中值,而不需要单独的过程/函数(这很好,因为
NUMERIC
NUMERIC(18,0)的缩写)
,这只是一种数字类型,T-SQL不允许在列或参数中使用动态类型,因此编写一个完全通用的
中值
过程将是一个挑战)。@Jeroenmoster I虽然百分位盘(0.5)只能用于奇数行?检查我在这个线程中的响应,也许可以帮助您