Table - 值参数接收无效数据类型错误

Table-Valued Parameter Recieving Invalid Data Type Error

我有一组来自我开发的控制台应用程序的数据,我需要将这些数据传输到 SQL 数据库中。由于 SQL 注入是不稳定的,我决定尝试通过 table 值参数将其传递给存储过程。我创建的 table 类型没有问题,它列在 'User-Defined Table Types' 文件夹下。我遇到的问题是当我尝试创建我的存储过程时,我收到此错误:

Msg 2715, Level 16, State 3, Procedure sp_IsertBackupData, Line 2 [Batch Start Line 0] Column, parameter, or variable #1: Cannot find data type VeeamTableType. Parameter or variable '@VeeamTableType' has an invalid data type.

有没有人知道这里可能出现的问题?

我已经尝试刷新本地缓存。

CREATE PROCEDURE sp_IsertBackupData

@VeeamTableType VeeamTableType READONLY 

AS 

BEGIN

    DECLARE @q varchar(1000)
    SET @q= 'SELECT * FROM' + @VeeamTableType


    INSERT INTO ASManagement.dbo.VeeamBackupResults 
    (
    Id, 
    Server,
    BackupLogFileName,
    BackupLogFileSize,
    CreatedOn 
    )

    EXEC (@q)

END


SELECT * FROM ASManagement.VeeamBackupResults

CREATE TYPE VeeamBackupResults.VeeamTableType as TABLE

(

    Id int primary key,

    Server varchar(500) null,

    BackupLogFileName varchar (500) null, 

    BackupLogFileSize float null, 

    CreatedOn datetime null

)

你不需要动态sql

CREATE PROCEDURE sp_IsertBackupData   
      @VeeamTableType VeeamTableType READONLY 
AS    
BEGIN
    INSERT INTO ASManagement.dbo.VeeamBackupResults 
    (
      Id, 
      Server,
      BackupLogFileName,
      BackupLogFileSize,
      CreatedOn 
    )
    SELECT * 
    FROM @VeeamTableType;
END

Fiddle 创建 proc

出现错误的根本原因是存储过程找不到 VeeamTableType,因为 你在 VeeamBackupResults 架构下创建它 并且你正在尝试创建默认模式下的过程(dbo 大多数人不会将默认模式更改为另一个模式)

因此,要修复错误,您应该遵循以下解决方案之一:-

1) 在 VeeamBackupResults 模式下创建过程

试试 CREATE PROCEDURE VeeamBackupResults.sp_IsertBackupData

而不是 CREATE PROCEDURE sp_IsertBackupData

或 2) 使用正确的架构传递 VeeamTableType

尝试: @VeeamTableType VeeamBackupResults.VeeamTableType READONLY

而不是: @VeeamTableType VeeamTableType READONLY

或 3) 将用户定义 table 变量创建到默认模式

尝试: CREATE TYPE VeeamTableType as TABLE

而不是: CREATE TYPE VeeamBackupResults.VeeamTableType as TABLE