【问题标题】:Can a table valued parameter to stored procedure have default values存储过程的表值参数是否可以具有默认值
【发布时间】:2016-09-03 03:04:30
【问题描述】:

假设我有一个两列用户定义表类型

CREATE TYPE [Schema].[Type] AS TABLE (
    [Name]         NVARCHAR (100) NULL
    [Value]         int NULL
);

进一步假设我有将表类型传递给的存储过程

CREATE PROCEDURE [Schema].[sp_SomeProcedure]
@TVP [Type] READONLY
AS
SELECT 
[Name]
,1 + [Value]
FROM
@TVP

我可以默认@TVP的值是

(SELECT 'John', 1)  

【问题讨论】:

标签: sql sql-server


【解决方案1】:

您可以在调用过程时为 TVP 使用“DEFAULT”关键字。这将传递一个空表类型。

示例 - 如果 TVP 是传递给过程的第二个参数:

    Exec myProcedure (intParam, DEFAULT) 

【讨论】:

  • 您也可以简单地不指定参数以达到相同的效果。
【解决方案2】:

SQL Server 不允许将 TVP 设为可选参数,但可以为其设置某种默认值,如果您的过程中有 TVP,则需要在运行时传递 TVP。

但是有一种方法可以解决这个问题,在您的程序中添加另一个参数来决定 TVP 在您的程序中的行为。

请注意,在任何情况下,您都需要在运行时将 TVP 传递给您的过程。

CREATE PROCEDURE [Schema].[sp_SomeProcedure]
   @TVP_Default BIT = 1 
  ,@TVP [dbo].[Test_Type] READONLY
AS
BEGIN
    DECLARE @tempTable TABLE (
                            [Name]  NVARCHAR(100) NULL
                           ,[Value] int NULL
                           );

-- If @TVP_Default = 1 default values will be populated 
-- else values passed to TVP will be used    
IF (@TVP_Default = 1)
  BEGIN 
    INSERT INTO @tempTable([Name] , [Value])
    SELECT 'John' , 1
  END
ELSE
  BEGIN 
    INSERT INTO @tempTable([Name] , [Value])
    SELECT   [Name]
          ,1 + [Value]
    FROM @TVP
  END

  /*   
        rest of the code

       use @tempTable instead of the TVP in rest of the code
  */

END

【讨论】:

  • 谢谢,这不是我想要的,但它会做的。作为替代而不是混合两个表,我只是使用一个实际的#temptable,我在默认情况下将 TVP 和 tempTable 联合起来,或者在非默认情况下选择 *,然后我可以引用一个对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2018-05-09
相关资源
最近更新 更多