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

Sql server 将表变量传递给SQL Server存储过程,sql-server,sql-server-2012,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]

我试图将表变量传递给存储过程,但出现错误:

操作数类型冲突:表与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
) ;
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
:
:
EXEC p_DATA_Save_Sampling_Results   @_l_Tempo_Table             ,
                                    @_l_Result_Code    OUTPUT   ,       -- Integer param
                                    @_l_Result_Message OUTPUT     ;     -- String
2-在调用过程中声明的局部表变量(在将数据传递给另一个过程之前,有一个INSERT将数据注入该局部表变量)

3-程序声明

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
) ;
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
:
:
EXEC p_DATA_Save_Sampling_Results   @_l_Tempo_Table             ,
                                    @_l_Result_Code    OUTPUT   ,       -- Integer param
                                    @_l_Result_Message OUTPUT     ;     -- String
4-过程调用

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
) ;
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
:
:
EXEC p_DATA_Save_Sampling_Results   @_l_Tempo_Table             ,
                                    @_l_Result_Code    OUTPUT   ,       -- Integer param
                                    @_l_Result_Message OUTPUT     ;     -- String

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

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

如下图所示:

DECLARE @@_l_Tempo_Table AS TY_MyType;  
你已经声明如下

DECLARE @_l_Tempo_Table TABLE

请参见

即使它的速度可能不如使用表变量快,也可以避免管理以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
在存储过程
栏中

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
我强烈建议在向临时表中插入数据之前先创建临时表,并根据使用情况在临时表上创建索引


我没有尝试代码,所以我可能在其中留下了一些拼写错误。

将@u l_Tempo_Table声明为ty_mytype
谢谢@ZoharPeled,但我在
附近得到了一个错误,我猜是非法语法。对不起,忘记了模式。声明变量与ypu在存储过程中声明的参数相同,只是没有readonly.BINGO@ZoharPeled!!!!谢谢你!!!!感谢IngoB的回答,但是:(1)您发送的参考是2016版,而我的情况是2012版;(2)我需要向过程传递一个表,而不是一条记录。谢谢@TheGameiswar。第二个问题仍然存在;我需要传递多个记录,而不是一个记录。Si I在第一个过程中创建了一个表变量,与类型的相同声明相匹配,将记录插入其中,并将其作为参数传递。这就是触发错误条件的地方。您可以检查引用的链接,它有Example。请在类型变量中插入行。:)