我正在尝试将表变量传递给存储过程,我收到错误:
操作数类型冲突:表格与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
调用因上述错误消息而失败,这似乎表明传递的表和预期的表之间存在不一致,但我无法确定这种不一致的位置。
答案 0 :(得分:10)
您必须声明类型的变量,填充其中的数据,并使用此类型变量调用该过程,而不是使用表变量。
如下所示:
DECLARE @@_l_Tempo_Table AS TY_MyType;
你已声明如下
DECLARE @_l_Tempo_Table TABLE
答案 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
我强烈建议在将临时表插入数据之前创建临时表,并在其上创建索引以适合使用。
我没有尝试过代码,因此可能在其中留下了一些错字。