将表变量传递给SQL Server存储过程

时间:2017-06-18 09:57:41

标签: sql-server sql-server-2012

我正在尝试将表变量传递给存储过程,我收到错误:

  

操作数类型冲突:表格与TY_MyType

不兼容

以下是相关的代码:

1 - 类型定义

CREATE TYPE [dbo].[TY_MyType] AS TABLE(
        [Sampling_ID]               [int]           NULL,
        [Parameter_Name]            [nvarchar](32)  NULL,
        [Measuring_Method_Code]     [int]           NULL,
        [Greater_or_Smaller]        [varchar](1)    NULL,
        [Parameter_Value]           [float]         NULL,
        [Measured_By]               [int]           NULL,
        [No_Measurement_Code]       [int]           NULL,
        [No_Measurement_Comments]   [varchar](512)  NULL,
        [Update_Reason_Code]        [int]           NULL,
        [General_Comment]           [varchar](512)  NULL
) ;

2 - 在调用过程中声明的本地表变量(有一个INSERT,在将数据传递给另一个过程之前将数据注入此本地表变量)

DECLARE @_l_Tempo_Table TABLE ( Sampling_ID             INT             ,
                                Parameter_Name          NVARCHAR(32)    ,
                                Measuring_Method_Code   INT             ,
                                Greater_or_Smaller      VARCHAR(1)      ,
                                Parameter_Value         FLOAT           ,
                                Measured_By             INT             ,
                                No_Measurement_Code     INT             ,
                                No_Measurement_Comments VARCHAR(512)    ,
                                Update_Reason_Code      INT             ,
                                General_Comment         VARCHAR(512)
                              ) ;

3 - 程序声明

CREATE PROCEDURE [p_DATA_Save_Sampling_Results]   (
                                        @_p_Results         [UWQ].[TY_MyType] READONLY   ,
                                        @_p_Result_Code     INT             OUTPUT       ,
                                        @_p_Result_Message  NVARCHAR(2000)  OUTPUT
                                                  ) 
AS
:
:

4 - 程序调用

EXEC p_DATA_Save_Sampling_Results   @_l_Tempo_Table             ,
                                    @_l_Result_Code    OUTPUT   ,       -- Integer param
                                    @_l_Result_Message OUTPUT     ;     -- String

调用因上述错误消息而失败,这似乎表明传递的表和预期的表之间存在不一致,但我无法确定这种不一致的位置。

2 个答案:

答案 0 :(得分:10)

您必须声明类型的变量,填充其中的数据,并使用此类型变量调用该过程,而不是使用表变量。

如下所示:

DECLARE @@_l_Tempo_Table AS TY_MyType;  

你已声明如下

DECLARE @_l_Tempo_Table TABLE

请参阅https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine

答案 1 :(得分:1)

即使它可能不如使用表变量快,您也可以避免管理表类型的所有麻烦将数据作为json传递。

在存储过程foo中:

CREATE PROCEDURE [dbo].[foo]() 
AS
BEGIN
   DECLARE @json nvarchar(max)

   SELECT @json = (SELECT [id], [value] 
                   FROM cooltable 
                   FOR JSON PATH)
   EXEC bar @json
END

在存储过程bar中:

CREATE PROCEDURE [dbo].[bar](@json nvarchar(max)) 
AS
BEGIN
    IF (ISJSON(@json) = 1)
    BEGIN
        SELECT [id], [value]
        INTO #all
        FROM OPENJSON (@ids)  
             WITH ([id] varchar(200) '$.id',
                   [value] varchar(200) '$.value') AS a
    END

    --
    -- use #all
    --
END

我强烈建议在将临时表插入数据之前创建临时表,并在其上创建索引以适合使用。

我没有尝试过代码,因此可能在其中留下了一些错字。