【问题标题】:top 1 row from User Defined Table Type用户定义表类型的前 1 行
【发布时间】:2016-10-12 17:49:45
【问题描述】:

有没有办法从作为参数传递给存储过程的“用户定义的表类型”中选择前 1 行?

CREATE TYPE t1 as TABLE
(
   id INT,
   name VARCHAR(100)
)

SP

CREATE STORED PROCEDURE sp1
(
    @type dbo.t1 as READONLY
)
BEGIN
   SELECT TOP 1 name FROM @type
END

有什么想法吗?

【问题讨论】:

  • 从@type 而非 t1 中选择
  • 纠正语法错误并删除无关内容,这将起作用:CREATE PROCEDURE sp1 @type dbo.t1 READONLY AS SELECT TOP 1 name FROM @type;。请注意,没有ORDER BYTOP 可以从表中选择任意行;它不是确定性的。

标签: sql-server user-defined-types


【解决方案1】:

你的存储过程应该是这样的:

CREATE STORED PROCEDURE sp1
(
    @type dbo.t1 READONLY
)
BEGIN
   SELECT TOP 1 name 
   FROM @type t1
   ORDER BY id
END

注意事项:

  1. 我删除了as 关键字
  2. 使用TOP n 而不使用ORDER BY 子句将返回单行,但不能保证它将是哪一行,因为数据库表本质上是未排序的。

【讨论】:

    【解决方案2】:

    看看下面的工作示例,它详细介绍了如何从 SP 中CREATE/PASS/CALL 用户定义的表类型。

    用户定义表类型创建脚本:

    CREATE TYPE [dbo].[IdCenterIdList] AS TABLE(
        [Id] [varchar](36) NOT NULL,
        [CenterId] [varchar](36) NOT NULL
    )
    

    SP 创建:

    CREATE PROCEDURE TestType
        @IdCenterIdList AS IdCenterIdList ReadOnly
    AS
    BEGIN
        SELECT 
            TOP(1) * 
        FROM @IdCenterIdList
    END
    GO
    

    SP 执行语句:

    DECLARE @tblTestType IdCenterIdList 
    
    INSERT INTO @tblTestType VALUES('11','1111')
    ,('22','222')
    ,('33','333')
    
    EXEC TestType @tblTestType
    

    输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      相关资源
      最近更新 更多