Sql server 将表变量传递给SQL Server存储过程
我试图将表变量传递给存储过程,但出现错误: 操作数类型冲突:表与TY_MyType不兼容 以下是相关代码: 1-类型定义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]
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。请在类型变量中插入行。:)