web-dev-qa-db-fra.com

Passer une variable de table à une procédure stockée SQL Server

J'essaie de passer une variable de table à une procédure stockée et j'obtiens l'erreur:

Clash de type opérande: la table est incompatible avec TY_MyType

Voici les morceaux de code pertinents:

1 - Définition de type

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 - Variable de table locale déclarée dans la procédure d'appel (il y a un INSERT qui injecte des données dans cette variable de table locale avant de les passer à une autre procédure)

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)
                              ) ;

- Déclaration de procédure

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 - Appel de procédure

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

L'invocation échoue avec le message d'erreur mentionné ci-dessus, qui semble indiquer qu'il existe une incohérence entre les tables passées et attendues, mais je ne peux pas comprendre où une telle incohérence pourrait être.

10
FDavidov

Vous devez déclarer une variable de votre type, y remplir les données et appeler la procédure avec cette variable de type, pas avec une variable de table.

comme ci-dessous:

DECLARE @@_l_Tempo_Table AS TY_MyType;  

vous avez déclaré comme ci-dessous

DECLARE @_l_Tempo_Table TABLE

Voir https://docs.Microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine

11
IngoB