【问题标题】:Passing a table variable to a stored procedure将表变量传递给存储过程
【发布时间】:2019-07-18 23:43:56
【问题描述】:

我正在寻求创建一个可以传递单列表的过程,该过程将输出中位数。现在我有一个程序可以确定中位数;但是,我收到的错误是我的@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)

注意:砷代表水测试结果的砷水平,数值范围从零到10

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

【问题讨论】:

  • 如果你想传递一个表值参数,你必须首先定义你的自定义表类型。这在文档中进行了概述。 docs.microsoft.com/en-us/sql/relational-databases/tables/…
  • 试试这个:google.com/… 您在存储过程中使用表值参数的尝试看起来不像我见过的任何示例。
  • 在 SQL Server 2012 及更高版本上,PERCENTILE_DISC(0.5) 将计算中位数而不需要单独的过程/函数(这很好,因为 NUMERICNUMERIC(18, 0) 的缩写,但一种数字类型,而 T-SQL 不允许在列或参数中使用动态类型,因此编写一个完全通用的 median 过程将是一个挑战)。
  • @JeroenMostert 我虽然 PERCENTILE_DISC(0.5) 只能用于奇数行?
  • 查看我在这个帖子中的回复,也许可以帮到你stackoverflow.com/questions/43083962/…

标签: sql sql-server ssms


【解决方案1】:

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

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

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

CREATE  PROCEDURE PassTableTypeIntoProcedure(@EmployeeType EmployeeType READONLY)
AS
BEGIN
       INSERT INTO Employee
       SELECT * FROM @EmployeeType
END
GO

    DECLARE @EmployeeTypeVariable AS EmployeeType
    INSERT INTO @EmployeeTypeVariable  VALUES
    (1,'A'),
    ( 2,'B')

    EXEC PassTableTypeIntoProcedure @EmployeeTypeVariable
    GO
    SELECT * FROM Employee

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 2020-05-08
    • 2015-12-20
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多